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(过期的凭证)

 

对于页面的错误消息展示,最好使用如 “用户名 / 密码错误” 而不是 “用户名错误”/“密码错误”,防止一些恶意用户非法扫描帐号库;

Shiro身份认证

 

身份验证流程

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 获取身份验证信息,