最近作接入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);