Shiro 免密登录

故事扮演 提交于 2021-02-18 08:52:56

最近做接入SSO单点登录,需要从别的系统返回的用户然后直接登录,所以需要用到免密登录,其实很简单,自己写一个类继承HashedCredentialsMatcher类,然后重写doCredentialsMatch,判断免密登录规则可结合实际业务需求更改,符合规则的return true就代表密码校验通过,代码如下:

import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;

public class CybHashedCredentialsMatcher extends HashedCredentialsMatcher {

	@Override
	public boolean doCredentialsMatch(AuthenticationToken authcToken, AuthenticationInfo info) {
		UsernamePasswordToken token = (UsernamePasswordToken) authcToken;
		if(StringUtils.isNotBlank(token.getSubtype())) {
			return true;
		}
		// 将密码加密与系统加密后的密码校验,内容一致就返回true,不一致就返回false
		return super.doCredentialsMatch(token, info);
	}
}

我的UsernamePasswordToken是继承了org.apache.shiro.authc.UsernamePasswordToken然后添加了subtype字段的,这是ThinkGem大师的代码

最后在Shiro登录认证方法doGetAuthenticationInfo里面把HashedCredentialsMatcher类换成刚刚写好的CybHashedCredentialsMatcher类就行了,然后放入setCredentialsMatcher方法作为参数。

最后是免密登录代码

        UsernamePasswordToken token = new UsernamePasswordToken();
        //账号一定要在数据库中, 密码随便填
		token.setUsername("lisi");
		token.setPassword("123".toCharArray());
        //subtype为判断是否免密登录的重要参数
		token.setSubtype("SSO登录");
		SecurityUtils.getSubject().login(token);

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!