小程式H5的自動登入(後臺Shiro)

棲息之鷹發表於2021-04-26

場景:公司開發小程式,除了正常頁面訪問小程式後臺之外,還有一些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);
    }
}

 

相關文章