场景:公司开发小程序,除了正常页面访问小程序后台之外,还有一些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); } }