最近遇到的需求,实现手机号+验证码登录,验证码能够通过查数据库校验,但是密码是加密过的对不上,需要免密登录,所以写一下帮助后人
1.shiro的配置文件里面有一个是<bean id="credentialsMatcher" class="xxxxx.xxxMatcher">这需要一个继承HashedCredentialsMatcher的子类,重写doCredentialsMatch方法
2.自定义一个token,继承自UsernamePasswordToken,添加一个标识符表名是否免密登录。
3.Subject subject = SecurityUtils.getSubject();
EasyTypeToken token = new EasyTypeToken(loginName);
subject.login(token);
4.回到第一步 重写方法的第一行 直接强转 token 获取标识符 如果为免密登录 直接返回true
下面贴部分代码
public class EasyTypeToken extends UsernamePasswordToken {
private static final long serialVersionUID = -2564928913725078138L;
private LoginType type;
public EasyTypeToken() {
super();
}
public EasyTypeToken(String username, String password, LoginType type, boolean rememberMe, String host) {
super(username, password, rememberMe, host);
this.type = type;
}
/**免密登录*/
public EasyTypeToken(String username) {
super(username, "", false, null);
this.type = LoginType.NOPASSWD;
}
/**账号密码登录*/
public EasyTypeToken(String username, String password) {
super(username, "", false, null);
this.type = LoginType.PASSWORD;
}
public LoginType getType() {
return type;
}
public void setType(LoginType type) {
this.type = type;
}
}
public enum LoginType {
PASSWORD("password"), // 密码登录
NOPASSWD("nopassword"); // 免密登录
private String code;// 状态值
private LoginType(String code) {
this.code = code;
}
public String getCode () {
return code;
}
}
HashedCredentialsMatcher子类的重写方法部分代码
@Override
public boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) {
EasyTypeToken tk = (EasyTypeToken) token;
if(tk.getType().equals(LoginType.NOPASSWD)){
return true;
}
.....
}