小程序H5的自動登錄(后台Shiro)


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM