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();
}
此時我們的密碼校驗類就替換成了我們自己的。