Shiro 学习笔记(Authentication)
Shiro Authentication身份认证
1.Subjiect 包含两种信息:
1)Principals:身份,可以是用户名,邮件,手机号码等等,用来标识一个登录主体身份;
2)Credentials:凭证,常见有密码,数字证书等等
最常见组合就是:用户名、密码
2.验证主体
UsernamePasswordToken,支持最常用的用户名/密码认证方式
1)根据用户名和密码获取一个令牌:UsernamePasswordToken token = new UsernamePasswordToken(username, password);
2)通过SecurityUtils工具类获取当前执行的用户,然后进行身份认证:
//得到当前执行的用户 3 Subject currentUser = SecurityUtils.getSubject(); 4 //进行认证 5 currentUser.login(token);
3)根据认证的结果来处理正确或者错误的结果
try { currentUser.login(token); } catch ( AuthenticationException ae ) { //unexpected error? //Handel error }
4)退出:currentUser.logout();
3.认证过程(Authentication Sequence)
身份认证过程示例:
public class JdbcRealm { public static void main(String[] args) { // 读取配置文件,初始化SecurityManager工厂 Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:jdbc_realm.ini"); // 获取securityManager实例 SecurityManager securityManager = factory.getInstance(); // 把securityManager实例绑定到SecurityUtils SecurityUtils.setSecurityManager(securityManager); // 得到当前执行的用户 Subject currentUser = SecurityUtils.getSubject(); // 创建token令牌,用户名/密码 UsernamePasswordToken token = new UsernamePasswordToken("倪升武2", "123"); try{ // 身份认证 currentUser.login(token); System.out.println("身份认证成功!"); }catch(AuthenticationException e){ e.printStackTrace(); System.out.println("身份认证失败!"); } // 退出 currentUser.logout(); } }
1)UsernamePasswordToken 实现HostAuthenticationToken和RemeberAuthenticationToken,HostAuthenticationToken实现AuthenticationToken
2)首先调用 Subject.login(token)进行登录,其会自动委托给 Security Manager,调用之前必须通过 SecurityUtils. setSecurityManager()设置;
3)SecurityManager 负责真正的身份验证逻辑;它会委托给 Authenticator 进行身份验证;SecurityManager j接口继承Authenticator、Authrizer、sessionManage接口
4)Authenticator 才是真正的身份验证者,Shiro API 中核心的身份认证入口点,此处可以自定义插入自己的实现;
5)Authenticator 可能会委托给相应的 AuthenticationStrategy 进行多 Realm 身份验证,默认ModularRealmAuthenticator 会调用 AuthenticationStrategy 进行多 Realm 身份验证;
6)Authenticator 会把相应的 token 传入 Realm,从 Realm 获取身份验证信息,如果没有返回/抛出异常表示身份验证失败了。此处可以配置多个 Realm,将按照相应的顺序及策略进行访问
4.异常 AuthenticationException
DisabledAccountException 账户失效异常
ExcessiveAttemptsException 尝试次数过多
UnknownAccountException 用户不正确
ExpiredCredentailsException 凭证过期
IncorrectCredentailsException 凭证不正确