第一次写这个东西,可能有些地方不怎么好,大家见谅。好了,下面就是内容了。具体的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);
}