认证(Authentication)是校验用户身份的过程,典型的三步操作是:
- 收集用户身份信息(
principals
)和身份证明(credentials
); - 提交身份信息(
principals
)和身份证明(credentials
)给系统; - 如果提交的身份信息(
principals
)和身份证明(credentials
)在系统中匹配到对应记录,则认证通过,否则认证失败。
使用 Shiro 执行认证需要传递一个 AuthenticationToken
实例,该实例封装了 principals
和 credentials
,如用户名和密码。
// 1.获取请求登录时提交的 `principals`(用户名) 和 `credentials`(密码)
AuthenticationToken token = new UsernamePasswordToken(username, password);
// 2.获取当前用户
Subject currentUser = SecurityUtils.getSubject();
// 3.执行登录操作
currentUser.login(token);
可见 Shiro Authentication API 执行过程和典型的认证三步类似。
Subject
的 login
方法一旦被调用,SecurityManager
会收到 AuthenticationToken
实例并将其分配给一个或多个已配置的 Realm
,交由这些 Realm
执行身份验证检查。如果 login
方法失败需要捕获 Shiro 提供的运行时异常 AuthenticationException
以处理这些失败。
try {
currentUser.login( token );
} catch ( UnknownAccountException uae ) {
// 用户名不存在
} catch ( IncorrectCredentialsException ice ) {
// 密码错误
} catch ( LockedAccountException lae ) {
// 账户已被锁定,无法登录
}
// 检查其它更多异常类型
} catch ( AuthenticationException ae ) {
// 预期外异常
}
可用于检查的异常请参考:AuthenticationException