shiro 四 加密realm登录登出

 shiro加密操作

散列算法一般用于生成数据的摘要信息,是一种不可逆的算法,一般适合存储密码之类的数据,常见的散列算法人MD5、SHA等。一般进行散列算法时最好提供一个盐,比如加密密码(admin),产生的散列值是“21232f9757a837dasddadw”,可以到一些MD5

解密网站很容易的通过散列值得到“admin”,即如果直接对密码进行散列相对来说破解更容易,此时我们可以加一些干扰数据,如:用户名、ID。这样的散列的对象是“密码+用户名+ID”,这样生成的散列值相对来说更难破解。

步骤:1.自定义加密之后realm:重写3个方法:getName 、doGetAuthorizationInfo、doGetAuthenticationInfo三个方法

结构图:

shiro 四 加密realm登录登出_第1张图片

pom文件:




  4.0.0

  com.study
  shiro
  1.0-SNAPSHOT

  shiro
  
  http://www.example.com

  
    UTF-8
    1.7
    1.7
  

  


    
      junit
      junit
      4.11
      test
    

    
      commons-logging
      commons-logging
      1.1.3
    

    
      org.apache.shiro
      shiro-core
      1.2.2
    

  

  
    
      
        
        
          maven-clean-plugin
          3.1.0
        
        
        
          maven-resources-plugin
          3.0.2
        
        
          maven-compiler-plugin
          3.8.0
        
        
          maven-surefire-plugin
          2.22.1
        
        
          maven-jar-plugin
          3.0.2
        
        
          maven-install-plugin
          2.5.2
        
        
          maven-deploy-plugin
          2.8.2
        
        
        
          maven-site-plugin
          3.7.1
        
        
          maven-project-info-reports-plugin
          3.0.0
        
      
    
  

package com.study.shiro.realm;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;

public class PasswordRealm extends AuthorizingRealm {

    @Override
    public String getName() {
        return "PasswordRealm";
    }

    /**
     * 授权
     * @param principals
     * @return
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        return null;
    }

    /**
     * 认证
     * @param token
     * @return
     * @throws AuthenticationException
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        // 通过用户名查找用户信息,封装成一个AuthenticationInfo对象返回,方便认证器进行对比
        // 获取token中的用户名
        String username = (String) token.getPrincipal();
        // 通过用户名查询数据库,将该用户对应的信息查询出来:账号,密码
        String dbUsername = "zhangsan";
        if(!dbUsername.equals(username)){
            return null;
        }
        // 模拟数据库保存的加密之后的密码666 +账号+散列次数3次
        String password = "cd757bae8bd31da92c6b14c235668091";

        // info对象表示realm登录对比信息:参数1用户信息,参数2,:密码,参数3:盐,参数4:当前realm的名字
        SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(username, password, ByteSource.Util.bytes(dbUsername), getName());
        return simpleAuthenticationInfo;
    }
}

ini文件shiro-cryptography.ini

[main]
#定义凭证匹配器
credentialsMatcher=org.apache.shiro.authc.credential.HashedCredentialsMatcher
#散列算法
credentialsMatcher.hashAlgorithmName=md5
#散列次数
credentialsMatcher.hashIterations=3


#将凭证匹配器设置到realm
myRealm=com.study.shiro.realm.PasswordRealm
myRealm.credentialsMatcher=$credentialsMatcher
securityManager.realms=$myRealm

测试方法:

@Test
    public void testLoginByPasswordRealm() throws Exception{
        // 1.创建SecurityManager工厂对象,加载配置文件,创建
        Factory factory = new IniSecurityManagerFactory("classpath:shiro-cryptography.ini");
        // 2.通过工厂对象,创建Securitymanage对象
        SecurityManager securityManager = factory.getInstance();
        // 3.将securitymanage绑定到当前运行环境中,让系统随时随地的都可以访问securityManager对象
        SecurityUtils.setSecurityManager(securityManager);
        // 4:创建当前登录的主体,注意;此时主体没有经过认证
        Subject subject = SecurityUtils.getSubject();
        // 5:绑定主体登录的身份、凭证,即账号密码
        UsernamePasswordToken token = new UsernamePasswordToken("zhangsan","666");
        try {
            // 6.主体登录
            subject.login(token);
        }catch (IncorrectCredentialsException incorrectCredentialsException){
            System.out.println("密码错误!");
        }catch (UnknownAccountException UnknownAccountException){
            System.out.println("用户名错误!");
        }
        // 7:判断是否登录成功
        System.out.println("验证是否登录1:" + subject.isAuthenticated());
        // 8:登出
        subject.logout();
        System.out.println("验证是否登录2:" + subject.isAuthenticated());
    }

 

你可能感兴趣的:(shiro)