美文网首页
跟我学Shiro学习----密码加密登录退出

跟我学Shiro学习----密码加密登录退出

作者: 书眉间_清风 | 来源:发表于2018-09-30 17:24 被阅读0次

    Realm

    realm:域shiro是从realm获取安全数据(eg: 用户、角色、权限),就是说SecurityManger要验证用户身份,那么需要从Realm获取相应的用户进行比较确定用户身份是否合法;也需要从Realm得到相应用户的角色/权限进行验证用户是否能进行操作;可以把Realm看成DataSource,即数据源。之前用的是ini的配置方式将使用org.apache.shiro.realm.text.IniRealm。
    org.apache.shiro.realm.Realm 接口如下:

    String getName(); //返回一个唯一的Realm名字
    boolean supports(AuthenticationToken token); //判断此Realm是否支持此Token
    AuthenticationInfo getAuthenticationInfo(AuthenticationToken token)
     throws AuthenticationException;  //根据Token获取认证信息
    

    单 Realm 登录 配置

    1. 先编写realm文件
    public class MyRealm extends AuthorizingRealm {
        @Override
        public String getName() {
            return "MyRealm";
        }
         // 授权
        @Override
        protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
            return null;
        }
    
        // 身份认证
        @Override
        protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
            //用户名
            String userName = (String) authenticationToken.getPrincipal();
            if(!"zhangsan".equals(userName)){
                return null;
            }
            //假设从数据库读出来的密码是222
            String password="222";
            AuthenticationInfo authenticationInfo=new SimpleAuthenticationInfo(userName,password,getName());
            return authenticationInfo;
        }
        
    };
    
    1. 编写realm.ini 文件
    #声明一个realm
    MyRealm=com.tuyue.shiro.MyRealm
    #指定securityManager的realms实现
    securityManager.realms=$MyRealm
    

    测试结果

     @Test
        public void realm1() {
            //获取SecurityManager的实例
            Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:realm.ini");
            SecurityManager securityManager = factory.getInstance();
            SecurityUtils.setSecurityManager(securityManager);
            Subject subject = SecurityUtils.getSubject();
    
            UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "222");
            subject.login(token);
            //验证登录是否成功
            log.info("登录是否成功!"+subject.isAuthenticated());
            subject.logout();
            log.info("登录是否成功!"+subject.isAuthenticated());
        }
    
    2018-09-30 11:45:11.616  INFO 8056 --- [           main] a.s.s.m.AbstractValidatingSessionManager : Enabling session validation scheduler...
    2018-09-30 11:45:11.746  INFO 8056 --- [           main] c.tuyue.SpringbootshiroApplicationTests  : 登录是否成功!true
    2018-09-30 11:45:11.747  INFO 8056 --- [           main] c.tuyue.SpringbootshiroApplicationTests  : 登录是否成功!false
    2018-09-30 11:45:11.750  INFO 8056 --- [       Thread-2] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@16610890: startup date [Sun Sep 30 11:45:11 CST 2018]; root of context hierarchy
    

    登录加密操作

    一般情况下在数据库存的用户密码是加密后的,那么这种情况shiro是怎么验证的呢?
    我们先了解一个概念:散列算法
    散列算法 一般用于生成数据的摘要信息,是一种不可逆的算法,一般适合存储密码之类的数据,常见的散列算法如MD5、SHA等。一般进行散列时最好提供一个salt(盐),比如加密密码“admin”,产生的散列值是“21232f297a57a5a743894a0e4a801fc3”,可以到一些md5解密网站很容易的通过散列值得到密码“admin”,即如果直接对密码进行散列相对来说破解更容易,此时我们可以加一些只有系统知道的干扰数据,如用户名和ID(即盐);这样散列的对象是“密码+用户名+ID”,这样生成的散列值相对来说更难破解。
    闲话不多说直接上手
    1: 先模拟数据的加密操作

    public class PasswordMd5  {
         public static void main(String[] args) {
              String password ="222";
              //加密之后
              Md5Hash md5Hash=new Md5Hash(password);
              System.out.println("md5加密:"+md5Hash);
              //md5+加盐
              Md5Hash md5Hash1=new Md5Hash(password,"123");
              System.out.println("md5加密加盐:"+md5Hash1);
              //md5+盐+散列次数
              Md5Hash md5Hash2=new Md5Hash(password,"1234",3);
              System.out.println("md5+盐+散列次数:"+md5Hash2);
          }
    }
    md5加密:       bcbe3365e6ac95ea2c0343a2395834dd
    md5加密加盐:   ea281b47cb711da418c35b07b9f06cd5
    md5+盐+散列次数:148dc8607c574b5ddfb8845f55536cca
    

    2:编写加密的ini文件

    [main]
    #定义凭证匹配器
    credentialsMatcher=org.apache.shiro.authc.credential.HashedCredentialsMatcher
    
    #指定散列算法
    credentialsMatcher.hashAlgorithmName=md5
    #指定散列次数
    credentialsMatcher.hashIterations=3
    
    myRealm=com.tuyue.shiro.MyRealm
    myRealm.credentialsMatcher=$credentialsMatcher
    #指定securityManager的realms实现
    securityManager.realms=$myRealm
    

    3.测试结果

    @Test
        public void realm1() {
            //获取SecurityManager的实例
            Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:Passwordrealm.ini");
            SecurityManager securityManager = factory.getInstance();
            SecurityUtils.setSecurityManager(securityManager);
            Subject subject = SecurityUtils.getSubject();
            UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "222");
            subject.login(token);
            //验证登录是否成功
            log.info("登录是否成功!"+subject.isAuthenticated());
            subject.logout();
            log.info("登录是否成功!"+subject.isAuthenticated());
    
        }
    2018-09-30 17:20:30.006  INFO 10120 --- [           main] c.tuyue.SpringbootshiroApplicationTests  : 登录是否成功!true
    2018-09-30 17:20:30.006  INFO 10120 --- [           main] c.tuyue.SpringbootshiroApplicationTests  : 登录是否成功!false
    

    相关文章

      网友评论

          本文标题:跟我学Shiro学习----密码加密登录退出

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