場景:公司開發小程式,除了正常頁面訪問小程式後臺之外,還有一些H5頁面訪問另外一個系統的後臺,而且不用客戶再次登入
思路:H5頁面跳轉時,傳遞客戶唯一標示(兩個系統需要一致),以及驗證用的token(可加密生成,或者固定字串-不太安全)
實現:小程式端試用webview,不再多說,以下是後臺shiro的實現機制(核心在CredentialsMatcher的重寫)
1. 在realm實現中設定自定義的Matcher
@PostConstruct public void initCredentialsMatcher() { AutoLoginMatcher matcher = new AutoLoginMatcher(); // 定義在2中 matcher.setHashAlgorithmName(SystemService.HASH_ALGORITHM); matcher.setHashIterations(ShaUtils.HASH_INTERATIONS); setCredentialsMatcher(matcher); }
2. Matcher的重寫
/** * 登入密碼比較器(重寫主要用於自動登入的情況) * @author liuwei * @date 2021/1/30 */ public class AutoLoginMatcher extends HashedCredentialsMatcher { @Override public boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) { UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token; String autoLoginToken = usernamePasswordToken.getAutoLoginToken(); // 如果是自動登入 if(StringUtil.isNotEmpty(autoLoginToken)){ // 驗證token有效性(有效則直接返回true,不再需要比較密碼) try { if(InterfaceUtil.auth(InterfaceConstants.interfaceAccessSwitchOn, InterfaceConstants.interfaceGoRoundValidationOn, "study_login", InterfaceConstants.appKey,usernamePasswordToken.getRequestId(),autoLoginToken)){ return true; } } catch (Exception e){ throw new RuntimeException("介面請求認證失敗,請確認簽名是否正確!"); } } //不是免密登入,呼叫父類的方法 return super.doCredentialsMatch(usernamePasswordToken, info); } }