Shiro身份认证
身份认证
在 shiro 中,用户需要提供 principals (身份)和 credentials(证明)给 shiro,从而应用能验证用户身份:
principals——类似于银行卡号(一对多),即主体的标识属性
credentials——只有用户自己才知道的银行卡密码,证明 / 凭证,即只有主体知道的安全值,如密码 / 数字证书等
Subject 及 Realm,分别是主体及验证主体的数据源
基本流程:
1.获取 SecurityManager 并绑定到 SecurityUtils,这是一个全局设置,设置一次即可
2.通过 SecurityUtils 得到 Subject,其会自动绑定到当前线程;如果在 web 环境在请求结束时需要解除绑定
3.调用 subject.login 方法进行登录,其会自动委托给 SecurityManager.login 方法进行登录
常见异常
AuthenticationException 或其子类 |
DisabledAccountException(禁用的帐号) |
LockedAccountException(锁定的帐号) |
UnknownAccountException(错误的帐号) |
ExcessiveAttemptsException(登录失败次数过多) |
IncorrectCredentialsException (错误的凭证) |
ExpiredCredentialsException(过期的凭证) |
|
对于页面的错误消息展示,最好使用如 “用户名 / 密码错误” 而不是 “用户名错误”/“密码错误”,防止一些恶意用户非法扫描帐号库; |
身份验证流程
1.首先调用 Subject.login(token) 进行登录,其会自动委托给 Security Manager,调用之前必须通过 SecurityUtils.setSecurityManager() 设置;
2.SecurityManager 负责真正的身份验证逻辑;它会委托给 Authenticator 进行身份验证;
3.Authenticator 才是真正的身份验证者,Shiro API 中核心的身份认证入口点,此处可以自定义插入自己的实现;
4.Authenticator 可能会委托给相应的 AuthenticationStrategy 进行多 Realm 身份验证,默认 ModularRealmAuthenticator 会调用 AuthenticationStrategy 进行多 Realm 身份验证;
5.Authenticator 会把相应的 token 传入 Realm,从 Realm 获取身份验证信息,