Spring Security OAuth 个性化token
个性化Token 目的
- 默认通过调用 /oauth/token 返回的报文格式包含以下参数
{ "access_token": "e6669cdf-b6cd-43fe-af5c-f91a65041382", "token_type": "bearer", "refresh_token": "da91294d-446c-4a89-bdcf-88aee15a75e8", "expires_in": 43199, "scope": "server" }
并没包含用户的业务信息比如用户信息、租户信息等。
- 扩展生成包含业务信息(如下),避免系统多次调用,直接可以通过认证接口获取到用户信息等,大大提高系统性能
{ "access_token":"a6f3b6d6-93e6-4eb8-a97d-3ae72240a7b0", "token_type":"bearer", "refresh_token":"710ab162-a482-41cd-8bad-26456af38e4f", "expires_in":42396, "scope":"server", "tenant_id":1, "license":"made by pigx", "dept_id":1, "user_id":1, "username":"admin" }
密码模式生成Token 源码解析
主页参考红框部分
-
ResourceOwnerPasswordTokenGranter (密码模式)根据用户的请求信息,进行认证得到当前用户上下文信息
protected OAuth2Authentication getOAuth2Authentication(ClientDetails client, TokenRequest tokenRequest) { Map<String, String> parameters = new LinkedHashMap<String, String>(tokenRequest.getRequestParameters()); String username = parameters.get("username"); String password = parameters.get("password"); // Protect from downstream leaks of password parameters.remove("password"); Authentication userAuth = new UsernamePasswordAuthenticationToken(username, password); ((AbstractAuthenticationToken) userAuth).setDetails(parameters); userAuth = authenticationManager.authenticate(userAuth); OAuth2Request storedOAuth2Request = getRequestFactory().createOAuth2Request(client, tokenRequest); return new OAuth2Authentication(storedOAuth2Request, userAuth); }
-
然后调用AbstractTokenGranter.getAccessToken() 获取OAuth2AccessToken
protected OAuth2AccessToken getAccessToken(ClientDetails client, TokenRequest tokenRequest) { return tokenServices.createAccessToken(getOAuth2Authentication(client, tokenRequest)); }
-
默认使用DefaultTokenServices来获取token
public OAuth2AccessToken createAccessToken(OAuth2Authentication authentication) throws AuthenticationException { ... 一系列判断 ,合法性、是否过期等判断 OAuth2AccessToken accessToken = createAccessToken(authentication, refreshToken); tokenStore.storeAccessToken(accessToken, authentication); // In case it was modified refreshToken = accessToken.getRefreshToken(); if (refreshToken != null) { tokenStore.storeRefreshToken(refreshToken, authentication); } return accessToken; }
-
createAccessToken 核心逻辑
// 默认刷新token 的有效期 private int refreshTokenValiditySeconds = 60 * 60 * 24 * 30; // default 30 days. // 默认token 的有效期 private int accessTokenValiditySeconds = 60 * 60 * 12; // default 12 hours. private OAuth2AccessToken createAccessToken(OAuth2Authentication authentication, OAuth2RefreshToken refreshToken) { DefaultOAuth2AccessToken token = new DefaultOAuth2AccessToken(uuid); token.setExpiration(Date) token.setRefreshToken(refreshToken); token.setScope(authentication.getOAuth2Request().getScope()); return accessTokenEnhancer != null ? accessTokenEnhancer.enhance(token, authentication) : token; }
如上代码,在拼装好token对象后会调用认证服务器配置TokenEnhancer( 增强器) 来对默认的token进行增强。
-
TokenEnhancer.enhance 通过上下文中的用户信息来个性化Token
public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) { final Map<String, Object> additionalInfo = new HashMap<>(8); PigxUser pigxUser = (PigxUser) authentication.getUserAuthentication().getPrincipal(); additionalInfo.put("user_id", pigxUser.getId()); additionalInfo.put("username", pigxUser.getUsername()); additionalInfo.put("dept_id", pigxUser.getDeptId()); additionalInfo.put("tenant_id", pigxUser.getTenantId()); additionalInfo.put("license", SecurityConstants.PIGX_LICENSE); ((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(additionalInfo); return accessToken; }
基于pig 看下最终的实现效果
Pig 基于Spring Cloud、oAuth2.0开发基于Vue前后分离的开发平台,支持账号、短信、SSO等多种登录,提供配套视频开发教程。
https://gitee.com/log4j/pig
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
JAVA学习day12
1、构造方法在创建对象的时候,就有属性值——构造方法 set和get方法时对象创建后使用的 2、什么时候需要写构造方法2-1)当描述的事物在创建其对象时就要明确属性的值,这时就需要在定义类的时候书写带参数的构造方法。2-2)若创建对象时不需要明确具体的数据,这时可以不用书写构造方法(不书写也有默认的构造方法)。 没有写构造方法的:在编译时系统会自动创建一个空的构造方法class Person { //如果没有显示指定构造方法,编译会在编译时自动添加默认的构造方法 //Person(){} //空参数的默认构造方法 } 3、构造方法的格式:修饰符 构造方法名(参数列表){} 4、构造方法的体现: 构造方法没有返回值类型。也不需要写返回值。因为它是为构建对象的,对象创建完,方法就执行结束。 构造方法名称必须和类型保持一致。 构造方法没有具体的返回值。 构造方法的代码体现:class Person { // Person的成员属性age和name private int age; private String name; // Person的构造方法,拥有参数列表 Person(in...
- 下一篇
2019年2月值得一读的10本技术书籍(Python、算法、设计、历史等书籍)!
导语:读一本意义方长的书,能加深我们的理解能力,让灵魂感到冲突。“读书百遍,其义自现”。每次读书,都能秒趣横生,并从中得到可贵的知识。我们整理出2019年2月值得一读的十本技术书籍,其中涉及Python、算法、设计、历史等方面。这个春天就让书陪你度过吧。 1、《Django企业开发实战:高效Python Web框架指南》 书籍介绍: Django是使用Python语言编写的一个广受欢迎且功能完整的服务器端网站框架,是一个自由和开放源码的Web应用程序框架,它在GitHub上的Star数为39127。这是一本快速上手Django的实战指南,包含从零开发一个博客系统的完整案例,由资深开发工程师the5fire十多年开发经验总结而成。作者通过开发一个常见的系统,把自己生产环境中的经验融合了进去,通过实战项目不断帮助读者构建关于Django的知识体系,最终达到让读者能够通过Django开发线上Web系统。 2、《人人都是数据分析师:Tableau应用实战(第2版)》 书籍介绍: 畅销书基于10.5版本全新升级!由百度、阿里、菜鸟网络一线数据专家出品,由Tableau亚太区副总裁、百度副总裁、埃...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2全家桶,快速入门学习开发网站教程