irpas技术客

SpringSecurity+ oauth2实现同账号多端同时登录_未来守护UUID_多端登录

irpas 1127

问题复现 项目中使用了app+ pc+ 小程序,当用户同时登录app+pc时 其中一端会被挤下线。 出现原因 我们使用的是redis存储token,由于redis生token算法原因,多端登录返回同一个token,导致另外一端被挤下线,出现文章开头的情况。下图就是security基于redis生成token的方式 可见:extractKey方法中使用values去生成token,多端登录参数进入values都一样所以我们只需要重写token生成规则即可。 解决方式:重写token生成规则 加入登录端标识,每个端登录都需要传不一样的标识,比如:app:1,pc:2这样不同端生成token不一样不会相互影响 /** * @ClassName: CustomAuthenticationKeyGenerator * @Description: 自定义token生成规则 * @author: ruyi * @date: 2022/2/28 19:25 */ public class CustomAuthenticationKeyGenerator extends DefaultAuthenticationKeyGenerator { private static final String SCOPE = "scope"; private static final String USERNAME = "username"; private static final String DEVICE_TYPE = "device_type"; @Override public String extractKey(OAuth2Authentication authentication) { Map<String, String> values = new LinkedHashMap<String, String>(); OAuth2Request authorizationRequest = authentication.getOAuth2Request(); if (!authentication.isClientOnly()) { values.put(USERNAME, authentication.getName()); } if (authorizationRequest.getScope() != null) { values.put(SCOPE, OAuth2Utils.formatParameterList(new TreeSet<String>(authorizationRequest.getScope()))); } String deviceType = authorizationRequest.getRequestParameters().get(DEVICE_TYPE); //不同的端不同的类别 if (CharSequenceUtil.isNotBlank(deviceType)) { values.put(DEVICE_TYPE, deviceType); } // 如果是多租户系统,这里要区分租户ID 条件 return generateKey(values); } } 将自定义token生成规则装配进来 /** * @ClassName: CustomTokenStoreAutoConfiguration * @Description: redis token store 自动配置 * @author: ruyi * @date: 2022/2/28 19:25 */ @RequiredArgsConstructor @Configuration(proxyBeanMethods = false) public class CustomTokenStoreAutoConfiguration { private final KeyStrResolver resolver; private final RedisConnectionFactory connectionFactory; @Bean public TokenStore tokenStore() { RedisTokenStore tokenStore = new RedisTokenStore(connectionFactory); tokenStore.setPrefix(SecurityConstants.PIGX_PREFIX SecurityConstants.OAUTH_PREFIX); tokenStore.setAuthenticationKeyGenerator(new CustomAuthenticationKeyGenerator ()); return tokenStore; } } SecurityConstants.PIGX_PREFIX 与SecurityConstants.OAUTH_PREFIX是两个项目常量,可以自定义或者不加,不会影响生成。 测试一下 device_type =1 device_type =2 两次不同的device_type 返回的access_token都不一样- pc端也是在线的,不受影响

完美成功,如有疑问欢迎评论区交流!


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #多端登录 #问题复现项目中使用了app #PC #其中一端会被挤下线 #解决方式重写token生成规则