Spring Security OAuth2 实现登录互踢

工作中遇到的问题,通过网上查找资料,解决问题,记录一下,防止丢失。

1、重写DefaultTokenServices中的方法

​ 自定义一个TokenService类继承DefaultTokenServices,重写里面的createAccessToken、setTokenStore和setTokenEnhancer方法,代码如下:

public class TokenService extends DefaultTokenServices {private TokenEnhancer accessTokenEnhancer;private TokenStore tokenStore;@Transactional@Overridepublic OAuth2AccessToken createAccessToken(OAuth2Authentication authentication) throws AuthenticationException {OAuth2AccessToken existingAccessToken = tokenStore.getAccessToken(authentication);OAuth2RefreshToken refreshToken = null;if (existingAccessToken != null) {if (existingAccessToken.getRefreshToken() != null) {refreshToken = existingAccessToken.getRefreshToken();tokenStore.removeRefreshToken(refreshToken);}tokenStore.removeAccessToken(existingAccessToken);}if (refreshToken == null) {refreshToken = createRefreshToken(authentication);}else if (refreshToken instanceof ExpiringOAuth2RefreshToken) {ExpiringOAuth2RefreshToken expiring = (ExpiringOAuth2RefreshToken) refreshToken;if (System.currentTimeMillis() > expiring.getExpiration().getTime()) {refreshToken = createRefreshToken(authentication);}}OAuth2AccessToken accessToken = createAccessToken(authentication, refreshToken);tokenStore.storeAccessToken(accessToken, authentication);// In case it was modifiedrefreshToken = accessToken.getRefreshToken();if (refreshToken != null) {tokenStore.storeRefreshToken(refreshToken, authentication);}return accessToken;}private OAuth2RefreshToken createRefreshToken(OAuth2Authentication authentication) {if (!isSupportRefreshToken(authentication.getOAuth2Request())) {return null;}int validitySeconds = getRefreshTokenValiditySeconds(authentication.getOAuth2Request());String value = UUID.randomUUID().toString();if (validitySeconds > 0) {return new DefaultExpiringOAuth2RefreshToken(value, new Date(System.currentTimeMillis()+ (validitySeconds * 1000L)));}return new DefaultOAuth2RefreshToken(value);}private OAuth2AccessToken createAccessToken(OAuth2Authentication authentication, OAuth2RefreshToken refreshToken) {DefaultOAuth2AccessToken token = new DefaultOAuth2AccessToken(UUID.randomUUID().toString());int validitySeconds = getAccessTokenValiditySeconds(authentication.getOAuth2Request());if (validitySeconds > 0) {token.setExpiration(new Date(System.currentTimeMillis() + (validitySeconds * 1000L)));}token.setRefreshToken(refreshToken);token.setScope(authentication.getOAuth2Request().getScope());return accessTokenEnhancer != null ? accessTokenEnhancer.enhance(token, authentication) : token;}@Overridepublic void setTokenStore(TokenStore tokenStore) {super.setTokenStore(tokenStore);this.tokenStore = tokenStore;}@Overridepublic void setTokenEnhancer(TokenEnhancer accessTokenEnhancer) {super.setTokenEnhancer(accessTokenEnhancer);this.accessTokenEnhancer = accessTokenEnhancer;}

2、修改AuthServerConfig中的defaultTokenServices方法

    public DefaultTokenServices defaultTokenServices(){//        DefaultTokenServices services = new DefaultTokenServices();//新建一个TokenService继承并重写DefaultTokenServices中的方法,保证每次登录都会删除原来的token,达到一个账户不允许多端登录的效果TokenService services = new TokenService();//设置令牌2个小时过期,单位:秒System.out.println("设置令牌过期时间:"+accessTokenValidity+"秒");services.setAccessTokenValiditySeconds(accessTokenValidity == null ? 60*60*2:accessTokenValidity);//设置刷新token的过期时间,单位:秒System.out.println("设置刷新token过期时间:"+refreshTokenValidity+"秒");services.setRefreshTokenValiditySeconds(refreshTokenValidity == null ? 60*60*24*30:refreshTokenValidity);services.setSupportRefreshToken(true);services.setReuseRefreshToken(false);services.setTokenStore(tokenStore());services.setTokenEnhancer(tokenEnhancer);return services;}

参考博客:https://my.oschina.net/giegie/blog/4258857

Spring Security OAuth2 实现登录互踢相关推荐

  1. Spring Security OAuth2 单点登录和登出

    文章目录 1. 单点登录 1.1 使用内存保存客户端和用户信息 1.1.1 认证中心 auth-server 1.1.2 子系统 service-1 1.1.3 测试 1.2 使用数据库保存客户端和用 ...

  2. Spring Security Oauth2 单点登录案例实现和执行流程剖析

    我已经试过了 教程很完美 Spring Security Oauth2 OAuth是一个关于授权的开放网络标准,在全世界得到的广泛的应用,目前是2.0的版本.OAuth2在"客户端" ...

  3. Spring Security OAuth2 单点登录

    1. 概述 在前面的文章中,我们学习了 Spring Security OAuth 的简单使用. <Spring Security OAuth2 入门> <Spring Securi ...

  4. Spring Security OAuth2 实现多人登录互踢下线

    点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 ▊ 老赵推荐(戳下方标题) 阿里大牛程序员的Java问题排查工具单 我已经不用 try catch 处理异常了!太烦人 ...

  5. java oauth sso 源码_基于Spring Security Oauth2的SSO单点登录+JWT权限控制实践

    概 述 在前文<基于Spring Security和 JWT的权限系统设计>之中已经讨论过基于 Spring Security和 JWT的权限系统用法和实践,本文则进一步实践一下基于 Sp ...

  6. Spring Security OAuth2——自定义OAuth2第三方登录(Gitee)并与UsernamePassword登录关联解决方案

    前文:Spring Security OAuth2--自定义OAuth2第三方登录(Gitee) Maven 主要 <!--Spring Security--><dependency ...

  7. 微信官方你真的懂OAuth2?Spring Security OAuth2整合企业微信扫码登录

    ❝ 企业微信扫码登录DEMO参见文末. 现在很多企业都接入了企业微信,作为私域社群工具,企业微信开放了很多API,可以打通很多自有的应用.既然是应用,那肯定需要做登录.正好企业微信提供了企业微信扫码授 ...

  8. JWT实战 Spring Security Oauth2整合JWT 整合SSO单点登录

    文章目录 一.JWT 1.1 什么是JWT 1.2 JWT组成 头部(header) 载荷(payload) 签名(signature) 如何应用 1.3 JJWT 快速开始 创建token toke ...

  9. Spring Security Oauth2 授权码模式下 自定义登录、授权页面

    主要说明:基于若依springcloud微服务框架的2.1版本 嫌弃缩进不舒服的,直接访问我的博客站点: http://binarydance.top//aticle_view.html?aticle ...

最新文章

  1. 解析gui-config.json出差_LUA解析json小demo
  2. Android布局之LinearLayout
  3. js 的数值限制可能引起的问题
  4. mybatis框架中的queryWrapper的or查询,联想到MySQL中and 和or的关系
  5. 【音视频安卓开发 (五)】Android中获取音视频原始数据的方法
  6. 论文浅尝 | Hike: A Hybrid Human-Machine Method for Entity Alignment
  7. 老spring3.2版本 redistemplate 报错_植物大战僵尸加强版本
  8. Egg框架入门教程合集之插件/工具/教程/专栏/开源项目
  9. java 多线程 28 : 多线程组件之 Semaphore 信号量
  10. 基于小程序的定位健康打卡系统
  11. Python # 金十数据数字货币新闻爬取脚本
  12. html只显示一次,javascript – 只显示div一次
  13. java同步数据,int类型清空为0
  14. Liunx官网下载步骤
  15. 【React】unmountComponentAtNode卸载组件
  16. linux显卡用amd还是NVIDIA,Linux NVIDIA显卡驱动年度横评,不同于AMD,NVI
  17. origin画图对图片进行缩放时,如何不让文字一同缩放?
  18. Xcode iOS 工程目录结构解析
  19. 计算机用户名大小写,windows计算机名大小写
  20. 技术分享|数据分析与可视化

热门文章

  1. PAT乙级真题1058 || 选择题(详解,C/C++示例,测试点分析)
  2. Linux修复U盘只读问题
  3. keepdims=True
  4. # 设置防火墙白名单
  5. ESP32双核CPU,利用核0实现蓝牙打印机打印,核1完成常规控制
  6. 计算机绘画教案风车,《风车》幼儿园中班美术教案
  7. 嵌入式linux的开发流程
  8. 积跬步至千里:QUIC 协议在蚂蚁集团落地之综述
  9. 分析国内IT各领域软件企业的挣钱实力
  10. 视频 | 马云:如果有天阿里不在了,我们也要为世界留下这三样