美文网首页Shiro
SpringBoot+Shiro学习(二):逻辑介绍

SpringBoot+Shiro学习(二):逻辑介绍

作者: Hiwayz | 来源:发表于2018-08-23 15:50 被阅读13次

    我们先写一个简单的登录认证。

    //创建一个默认SecurityManager
    DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
    //创建一个自定义Realm对象
    CustomRealm realm = new CustomRealm();
    //将自定义Realm注入到SecurityManager里
    defaultSecurityManager.setRealm(realm);
    //创建加密Matcher,加密方式为md5,加密次数1
    HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();
    matcher.setHashAlgorithmName("md5");
    matcher.setHashIterations(1);
    //注入到Realm中,这样在验证的时候,会把token传进去的密码自动加密
    realm.setCredentialsMatcher(matcher);
    //获取Subject
    SecurityUtils.setSecurityManager(defaultSecurityManager);
    Subject subject = SecurityUtils.getSubject();
    //设置Token
    AuthenticationToken token = new UsernamePasswordToken("Hiway","123456");
    //登录验证
    subject.login(token);
    //是否成功验证
    System.out.println("isAuthentication:"+subject.isAuthenticated());
    //是否拥有角色
    subject.checkRoles("admin");
    //是否拥有权限
    subject.checkPermission("user:delete");
    //登出
    subject.logou();
    
    1. 从上可以看出,我们先是创建了一个SecurityManager,然后创建自定义Realm,将Realm注入。自定义Realm,这个我们下一节再讲,现在先可以把他理解为Shiro验证和授权的逻辑模块,通过把创建的Subject传入的数据,然后通过Realm来判断是否成功验证或授权。
    2. 接下来是加密模块,这个比较简单就不再做叙说。
    3. 接着获取SecurityManager并绑定到SecurityUtils,这是一个全局设置,设置一次即可;
    4. 通过SecurityUtils得到Subject,其会自动绑定到当前线程;然后获取身份验证的Token,如用户名/密码;
    5. 调用subject.login方法进行登录,其会自动委托给SecurityManager.login方法进行登录;
    6. 如果身份验证失败请捕获AuthenticationException或其子类,常见的如: DisabledAccountException(禁用的帐号)、LockedAccountException(锁定的帐号)、UnknownAccountException(错误的帐号)、ExcessiveAttemptsException(登录失败次数过多)、IncorrectCredentialsException (错误的凭证)、ExpiredCredentialsException(过期的凭证)等,具体请查看其继承关系;对于页面的错误消息展示,最好使用如“用户名/密码错误”而不是“用户名错误”/“密码错误”,防止一些恶意用户非法扫描帐号库;
      7.subject的一系列方法
      8.最后可以调用subject.logout退出,其会自动委托给SecurityManager.logout方法退出。

    AuthenticationToken

    image

    AuthenticationToken用于收集用户提交的身份(如用户名)及凭据(如密码):

    public interface AuthenticationToken extends Serializable {  
    Object getPrincipal(); //身份  
    Object getCredentials(); //凭据  
     }   
    

    扩展接口RememberMeAuthenticationToken:提供了“boolean isRememberMe()”现“记住我”的功能;

    扩展接口是HostAuthenticationToken:提供了“String getHost()”方法用于获取用户“主机”的功能。

    Shiro提供了一个直接拿来用的UsernamePasswordToken,用于实现用户名/密码Token组,另外其实现了RememberMeAuthenticationToken和HostAuthenticationToken,可以实现记住我及主机验证的支持。

    相关文章

      网友评论

        本文标题:SpringBoot+Shiro学习(二):逻辑介绍

        本文链接:https://www.haomeiwen.com/subject/pkpyiftx.html