zoukankan      html  css  js  c++  java
  • shiro自定义密码校验器

    shiro自定义密码校验器

    shiro内置了几个密码校验的类,有 Md5CredentialsMatcher Sha1CredentialsMatcher , 不过从1.1版本开始,都开始使用 HashedCredentialsMatcher 这个类了,通过配置加密规则来校验

    它们都实现了一个接口 CredentialsMatcher ,我这里也实现这个接口,实现一个自己的密码校验。

    新建MyCredentialsMatcher.java

    package cn.ishangit.neucommunity.config;
    
    import cn.ishangit.neucommunity.service.UserService;
    import cn.ishangit.neucommunity.util.CommunityUtil;
    import org.apache.shiro.authc.AuthenticationInfo;
    import org.apache.shiro.authc.AuthenticationToken;
    import org.apache.shiro.authc.SimpleAuthenticationInfo;
    import org.apache.shiro.authc.UsernamePasswordToken;
    import org.apache.shiro.authc.credential.CredentialsMatcher;
    import org.springframework.beans.factory.annotation.Autowired;
    
    import java.util.Objects;
    
    /**
     * @author Chen
     * @Description 自定义shiro密码比较器
     * @create 2020-01-29 21:21
     */
    
    public class MyCredentialsMatcher implements CredentialsMatcher {
    
        @Autowired
        private UserService userService;
    
        @Override
        public boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) {
            UsernamePasswordToken utoken=(UsernamePasswordToken) token;
            //获得用户输入的密码:(可以采用加盐(salt)的方式去检验)
            String inPassword = new String(utoken.getPassword());
            String username = utoken.getUsername();
            //获得数据库中的密码
            String dbPassword = (String) info.getCredentials();
            SimpleAuthenticationInfo saInfo = (SimpleAuthenticationInfo)info;
            String salt = userService.findUserByName(username).getSalt();
            inPassword = CommunityUtil.md5(inPassword+salt);
            //进行密码的比对
            boolean flag = Objects.equals(inPassword, dbPassword);
            return flag;
        }
    }
    
    

    配置自己的密码校验类替换默认的:由于是springboot,我们直接在配置类ShiroConfig里面配置:

    	/**
         * 创建DefaultWebSecurityManager
         * @return
         */
        @Bean("securityManager")
        public DefaultWebSecurityManager getDefaultWebSecurityManager(){
            DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
            getUserRealm().setCredentialsMatcher(myCredentialsMatcher());
            //关联UserRealm
            securityManager.setRealm(getUserRealm());
            return securityManager;
        }
    
        /**
         * 配置加密方式
         * @return
         */
        @Bean
        public MyCredentialsMatcher myCredentialsMatcher() {
            return new MyCredentialsMatcher();
        }
    

    此时我们的密码校验类就替换成了我们自己的。

  • 相关阅读:
    报表中的图形是怎么做出来的?如何在其中实现地图?
    多维分析的本质计算是什么?能做什么又不能做什么?
    报表工具对比选型系列用例——多源分片报表
    报表工具怎样适应移动端?
    报表工具怎样适应移动端?
    互联网技术部门该如何管理
    更好用 更简单的Java缓存框架 jscache
    古人是怎么排行
    Spark ML 机器学习之Word2Vec
    Spark ML之高级数据源
  • 原文地址:https://www.cnblogs.com/chen88/p/12241627.html
Copyright © 2011-2022 走看看