Shiro 免密登陸

最近作接入SSO單點登陸,須要從別的系統返回的用戶而後直接登陸,因此須要用到免密登陸,其實很簡單,本身寫一個類繼承HashedCredentialsMatcher類,而後重寫doCredentialsMatch,判斷免密登陸規則可結合實際業務需求更改,符合規則的return true就表明密碼校驗經過,代碼以下:java

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方法做爲參數。apache

最後是免密登陸代碼ide

UsernamePasswordToken token = new UsernamePasswordToken();
        //帳號必定要在數據庫中, 密碼隨便填
		token.setUsername("lisi");
		token.setPassword("123".toCharArray());
        //subtype爲判斷是否免密登陸的重要參數
		token.setSubtype("SSO登陸");
		SecurityUtils.getSubject().login(token);
相關文章
相關標籤/搜索