shiro 的重写密码验证。

第一次写这个东西,可能有些地方不怎么好,大家见谅。好了,下面就是内容了。具体的shiro里面的realm之类的,网上能搜到,我就不写给大家了。

1丶shiro的密码验证部分

其实都是在HashedCredentialsMatcher 这个里面进行的。下面这个配置文件就是默认给shiro的框架的自己的加密方式。

<!-- 凭证匹配器-->
    <bean id="credentialsMatcher"
        class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
        <property name="hashAlgorithmName" value="SHA-256" />
    </bean>

2丶重写密码验证

大家要使用自己的密码验证的方式则需要重写这个方法的内容。根据自己的验证规则进行验证。当然,大家也可以直接返回true,调过密码验证的部分。

 <!-- 凭证匹配器-->
    <bean id="credentialsMatcher"  class="com.ly.shiro.common.RetryLimitCredentialsMatcher">
         <property name="userLoginApi"  ref="userLoginApi"/>
         <property name="hashAlgorithmName" value="SHA-256" />
    </bean>

大家会看到上面的class是使用的自己的编写的,大家要写的内容就是里面的内容了、下面的例子里面我加入了。验证错误次数的东西。大家不喜欢的可以去掉。真正的密码验证是需要在doCredentialsMatch这个里面进行的。

public class RetryLimitCredentialsMatcher extends HashedCredentialsMatcher {
    private static final Logger log = LoggerFactory.getLogger(RetryLimitCredentialsMatcher.class);  
    private UserLoginApi userLoginApi;  
    private Cache<String, AtomicInteger> passwordRetryCache;  
    public RetryLimitCredentialsMatcher(CacheManager cacheManager) {  
        passwordRetryCache = cacheManager.getCache("passwordRetryCache");  
    }    
  
    @Override  
    public boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) {  
          
        String username = (String) token.getPrincipal();  
          // retry count + 1  
        UserLoginVo userLogin = this.getUserLoginApi().selectUserLogin(username);
        Integer times = userLogin.getLoginFailureTimes();
        if(Objects.isNull(userLogin.getLoginFailureTimes())){
            times = 0;
        }
        if(times > 4){
             throw new ExcessiveAttemptsException();  
        }   
        boolean matches = CustomCredentialsMatcher(token, info);
        if(!matches){
              userLogin.setLastFailureTime(new Date());
              userLogin.setLoginFailureTimes(times+1);
              this.userLoginApi.updateUserLogin(userLogin);
         }
          
        if (matches) {  
            userLogin.setLastLoginDate(new Date());
            this.userLoginApi.updateUserLogin(userLogin);
        }  
         return matches;
    }
    
    /**
     * 重写验证密码部分
     * @param authcToken
     * @param info
     * @return
     */
    public boolean CustomCredentialsMatcher(AuthenticationToken authcToken, AuthenticationInfo info){      
        UsernamePasswordCaptchaToken token = (UsernamePasswordCaptchaToken) authcToken;       
        UserLoginVo userLogin = this.getUserLoginApi().selectUserLogin(token.getUsername());       
        String password = String.valueOf(token.getPassword());        
        String sha256pwd = new Sha256Hash(password+userLogin.getLoginCode()).toString();  
        String sha256 = (String) info.getCredentials();
        return equals(sha256pwd,sha256);
    }

 
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值