码迷,mamicode.com
首页 > 其他好文 > 详细

shiro自定义密码校验器

时间:2020-01-29 23:51:10      阅读:99      评论:0      收藏:0      [点我收藏+]

标签:版本   info   use   get   自己的   class   定义   public   euc   

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();
    }

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

shiro自定义密码校验器

标签:版本   info   use   get   自己的   class   定义   public   euc   

原文地址:https://www.cnblogs.com/chen88/p/12241627.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!