ShiroFeatures_Authentication.png
认证是一个确认身份凭证的过程,证明一个用户是不是合法的。要确认一个用户是不是合法的,需要用户提供一个身份(principals)和凭证(credentials)。

  • Principals是用户提供的,能唯一标识一个用户的东西。可以是一个用户名,或者邮箱地址等能唯一表示用户的事物。
  • Credentials通常是只有用户自身才知道的一个凭证。通常是密码,或者X.509格式的证书等。

    认证的过程

    认证一个用户的过程通常有三步:
  1. 收集用户提供的身份和凭证。
  2. 提交身份和凭证去认证
  3. 如果认证成功,则允许访问。如果认证失败,则重新认证或者拒绝访问。

    收集用户身份和凭证

  1. //Example using most common scenario of username/password pair:
  2. UsernamePasswordToken token = new UsernamePasswordToken(username, password);
  3. //"Remember Me" built-in:
  4. token.setRememberMe(true);

在这里我们使用的是UsernamePasswordToken,支持常用的用户名和密码认证操作。它实现的是org.apache.shiro.authc.AuthenticationToken认证系统最基本的接口。
Shiro并不关注username和password是怎么来的,可以是从html表单中或者是http请求头里获取的,或者其他的途径。这对shiro来说,都是一样的。

提交身份和凭证

  1. Subject currentUser = SecurityUtils.getSubject();
  2. currentUser.login(token);

认证结果处理

Shiro的认证运行时异常AuthenticationException下有很多个子类。通过catch不同的异常,可以大概得知认证失败的原因。

  1. try {
  2. currentUser.login(token);
  3. } catch ( UnknownAccountException uae ) { ...
  4. } catch ( IncorrectCredentialsException ice ) { ...
  5. } catch ( LockedAccountException lae ) { ...
  6. } catch ( ExcessiveAttemptsException eae ) { ...
  7. } ... catch your own ...
  8. } catch ( AuthenticationException ae ) {
  9. //unexpected error?
  10. }
  11. //No problems, continue on as expected...

认证的执行流程

ShiroAuthenticationSequence.png