小程序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);
    }
}

 

posted @ 2021-04-26 15:43  栖息之鹰  阅读(782)  评论(1编辑  收藏  举报