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 凭证不正确

posted @ 2020-03-26 10:11  Jaine  阅读(225)  评论(0编辑  收藏  举报