1、定位到默认的oauth2登录时的createAccessToken方法源码
包位置 org\springframework\security\oauth2\provider\token\DefaultTokenServices.class
public OAuth2AccessToken createAccessToken(OAuth2Authentication authentication) throws AuthenticationException {
OAuth2AccessToken existingAccessToken = this.tokenStore.getAccessToken(authentication);
OAuth2RefreshToken refreshToken = null;
if (existingAccessToken != null) {
if (existingAccessToken.getRefreshToken() != null) {
refreshToken = existingAccessToken.getRefreshToken();
tokenStore.removeRefreshToken(refreshToken);
}
tokenStore.removeAccessToken(existingAccessToken);
}
...
}
2、重写上图所示代码方法,对redis中已存在的token直接删除,每次登录时都重新生成token,令旧的token失效从而达到踢用户下线的操作
3、具体操作:
- 复制defaultTokenService.class类,改为例如testTokenService,重写读取redis中的token的逻辑如下
OAuth2AccessToken existingAccessToken = this.tokenStore.getAccessToken(authentication);
OAuth2RefreshToken refreshToken = null;
if (existingAccessToken != null) {
if (existingAccessToken.getRefreshToken() != null) {
refreshToken = existingAccessToken.getRefreshToken();
tokenStore.removeRefreshToken(refreshToken);
}
tokenStore.removeAccessToken(existingAccessToken);
}
- 在认证服务器配置类
AuthorizationServerConfig
的public void configure(AuthorizationServerEndpointsConfigurer endpoints)
中,注入重写的tokenservice
endpoints.tokenServices(tokenServices(endpoints));
- 重启服务
网友评论