为什么使用JWT令牌

在上面的资源服务器中,通过配置,我们了解到,当我们拿着token去获取资源时,程序会先去调用远程认证服务器的端点去验证解析token,或者在本地解析校验token,这样毫无疑问,当访问量过大的时候,对认证服务器的压力可想而知,所以为了解决上面的问题,我们采用JWT令牌格式,可以优化上面的问题。

令牌采用JWT格式即可解决上边的问题,用户认证通过会得到一个JWT令牌,JWT令牌中已经包括了用户相关的信息,客户端只需要携带JWT访问资源服务,资源服务根据事先约定的算法自行完成令牌校验,无需每次都请求认证服务完成授权。

改造认证服务器

  1. 修改TokenConfig类,如下:
  1. @Configuration
  2. public class TokenConfigure {
  3. private static final String SIGNING_KEY = "dimples";
  4. @Bean
  5. public TokenStore tokenStore() {
  6. return new JwtTokenStore(accessTokenConverter());
  7. }
  8. @Bean
  9. public JwtAccessTokenConverter accessTokenConverter() {
  10. JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
  11. //对称秘钥,资源服务器使用该秘钥来验证
  12. converter.setSigningKey(SIGNING_KEY);
  13. return converter;
  14. }
  15. }
  1. 修改认证服务器的配置
  1. private JwtAccessTokenConverter jwtAccessTokenConverter;
  2. //通过构造方法注入
  3. ...
  4. /**
  5. * 修改
  6. * 令牌管理服务
  7. *
  8. * @return TokenServices
  9. */
  10. @Bean
  11. public AuthorizationServerTokenServices tokenServices() {
  12. DefaultTokenServices services = new DefaultTokenServices();
  13. // 客户端详情服务
  14. services.setClientDetailsService(clientDetailsService);
  15. // 支持令牌刷新
  16. services.setSupportRefreshToken(true);
  17. // 令牌存储策略
  18. services.setTokenStore(tokenStore);
  19. // 配置令牌增强 JWT
  20. TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();
  21. tokenEnhancerChain.setTokenEnhancers(Collections.singletonList(jwtAccessTokenConverter));
  22. services.setTokenEnhancer(tokenEnhancerChain);
  23. // 令牌默认有效期2小时
  24. services.setAccessTokenValiditySeconds(7200);
  25. // 刷新令牌默认有效期2天
  26. services.setRefreshTokenValiditySeconds(259200);
  27. return services;
  28. }
  1. 最后别忘了在pom中添加JWT的依赖,否则项目将会报错
  1. <dependency>
  2. <groupId>org.springframework.security</groupId>
  3. <artifactId>spring-security-jwt</artifactId>
  4. <version>1.1.0.RELEASE</version>
  5. </dependency>

测试结果如下:

可以使用OAuth的/oauth/check_token端点来解析验证一下该token

改造资源服务器

当我们使用了JWT令牌以后,由于在JWT令牌中我们存储了相应的用户信息和权限,这时我们可以直接在资源服务器中直接去解析对应令牌,就不用每次都去请求认证服务器端点,加大认证服务器的压力,下面我们开始改造资源服务器:

  1. 将上面认证服务器中写的TokenConfigure类拷贝一份到资源服务器
  2. 在资源服务器中屏蔽调之前的资源服务器令牌解析服务( tokenService() )
  3. 注入TokenConfigure类,然后配置到ResourceServerSecurityConfigurer里

完整的配置如下:

  1. @Configuration
  2. @EnableResourceServer
  3. @EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
  4. public class DimplesResourceServerConfigurerAdapter extends ResourceServerConfigurerAdapter {
  5. public static final String RESOURCE_ID = "dimples";
  6. private TokenStore tokenStore;
  7. @Autowired
  8. public DimplesResourceServerConfigurerAdapter(TokenStore tokenStore) {
  9. this.tokenStore = tokenStore;
  10. }
  11. @Override
  12. public void configure(ResourceServerSecurityConfigurer resources) {
  13. resources.resourceId(RESOURCE_ID)
  14. // .tokenServices(tokenService())
  15. .tokenStore(tokenStore)
  16. .stateless(true);
  17. }
  18. @Override
  19. public void configure(HttpSecurity http) throws Exception {
  20. http
  21. .authorizeRequests()
  22. // 配置客户端权限scope
  23. .antMatchers("/**").access("#oauth2.hasScope('all')")
  24. .and().csrf().disable()
  25. // 关闭session
  26. .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
  27. }
  28. }

然后重启服务,重新获取令牌,然后访问之前的测试接口:

OAuth + Security - 3 - JWT令牌的更多相关文章

  1. Spring Boot Security OAuth2 实现支持JWT令牌的授权服务器

    概要 之前的两篇文章,讲述了Spring Security 结合 OAuth2 .JWT 的使用,这一节要求对 OAuth2.JWT 有了解,若不清楚,先移步到下面两篇提前了解下. Spring Bo ...

  2. Spring Security OAuth2.0认证授权三:使用JWT令牌

    Spring Security OAuth2.0系列文章: Spring Security OAuth2.0认证授权一:框架搭建和认证测试 Spring Security OAuth2.0认证授权二: ...

  3. spring security oauth2搭建resource-server demo及token改造成JWT令牌

    我们在上文讲了如何在spring security的环境中搭建基于oauth2协议的认证中心demo:https://www.cnblogs.com/process-h/p/15688971.html ...

  4. 阶段5 3.微服务项目【学成在线】_day16 Spring Security Oauth2_13-SpringSecurityOauth2研究-JWT研究-生成JWT令牌&验证JWT令牌

    生成jwt需要用私钥来签名.在Auth认证服务下创建测试类 创建密钥工厂,构造函数需要的参数 获取私钥 有了私钥就可以生成JWT令牌 使用jwtHelper是spring security里面的类 e ...

  5. OAuth 2和JWT - 如何设计安全的API?

    OAuth 2和JWT - 如何设计安全的API? Moakap译,原文 OAuth 2 VS JSON Web Tokens: How to secure an API 本文会详细描述两种通用的保证 ...

  6. OAuth + Security -1 - 认证服务器配置

    配置 基础包依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g ...

  7. OAuth + Security - 5 - Token存储升级(数据库、Redis)

    PS:此文章为系列文章,建议从第一篇开始阅读. 在我们之前的文章中,我们当时获取到Token令牌时,此时的令牌时存储在内存中的,这样显然不利于我们程序的扩展,所以为了解决这个问题,官方给我们还提供了其 ...

  8. Spring Security + OAuth2 + JWT 基本使用

    Spring Security + OAuth2 + JWT 基本使用 前面学习了 Spring Security 入门,现在搭配 oauth2 + JWT 进行测试. 1.什么是 OAuth2 OA ...

  9. 【Spring Cloud & Alibaba 实战 | 总结篇】Spring Cloud Gateway + Spring Security OAuth2 + JWT 实现微服务统一认证授权和鉴权

    一. 前言 hi,大家好~ 好久没更文了,期间主要致力于项目的功能升级和问题修复中,经过一年时间的打磨,[有来]终于迎来v2.0版本,相较于v1.x版本主要完善了OAuth2认证授权.鉴权的逻辑,结合 ...

随机推荐

  1. P2816 宋荣子搭积木

    描述:https://www.luogu.com.cn/problem/P2816 saruka非常喜欢搭积木,他一共有n块积木.而且saruka的积木很特殊,只能一块块的竖着摞,可以摞很多列.说过s ...

  2. 使用 vi 命令创建一个cpp文件

    mkdir text //创建一个text的文件夹 cd text //打开text的文件夹 vi text.cpp //创建text.cpp 按住 i 键输入程序 输入后按esc,再按wq退出 ls ...

  3. Try-Catch包裹的代码异常后,竟然导致了产线事务回滚!

    导读:​一段被try-catch包裹后的代码在产线稳定运行了200天后忽然发生了异常,而这个异常竟然导致了产线事务回滚.这期间究竟发生了什么?日常在项目过程中该如何避免事务异常?就在这个时候,老板拿着 ...

  4. android实现计时器

    新建布局文件activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearL ...

  5. 51单片机实战UcosII操作系统

    中断定义为CPU对系统内外发生的异步事件的响应.异步事件是指没有一定时序关系的.随机发生的事件. 与前后台系统中的中断服务子程序不同,uC/OS-Ⅱ要知道当前内核是否正在处理中断.是否脱离中断. OS ...

  6. [hdu1506]单调队列(栈)

    题意:http://acm.hdu.edu.cn/showproblem.php?pid=1506看图一目了然.两个方向单调队列维护下. #include <iostream> #incl ...

  7. 排序算法:图解快速排序算法--不超过18行代码Python和JavaScript实现快速排序算法

    快速排序有三大要素 分别是 第一:找基准值--key 第二:分区 第三:比较数字大小 先来看下快速排序流程: 基准值key选取了第一个元素78 基准值是可以任意一个元素 因为选择了最左边的数据,那么就 ...

  8. linux centos7 和 windows下 部署 .net core 2.0 web应用

    centos7 下部署asp.net core 2.0应用 安装CentOS7 配置网络[可选] 安装.Net core2.0 创建测试Asp.net Core应用程序 正式部署项目 安装VMware ...

  9. ScrollView 内嵌百度地图问题解决

    在ScrollView上内嵌百度地图遇到两个问题 事件冲突,移动地图的时候屏幕滚动了 移动ScrollView的时候,百度地图出现黑边 问题1的处理就有各种办法了,核心都是拦截事件,我使用的办法是加一 ...

  10. 【基准测试】BenchmarkDotNet介绍

    BenchmarkDotNet 概述 BenchmarkDotNet helps you to transform methods into benchmarks, track their perfo ...