SpringBoot 整合 spring security oauth2 jwt完整示例 附源码

废话不说直接进入主题(假设您已对spring security、oauth2、jwt技术的了解,不懂的自行搜索了解)

依赖版本

  • springboot 2.1.5.RELEASE
  • spring-security-oauth2 2.3.5.RELEASE
  • jjwt 0.9.1

新增JWTokenConfig

1@Configuration 2public class JWTokenConfig { 3 4 @Bean 5 public TokenStore jwtTokenStore() { 6 return new JwtTokenStore(jwtAccessTokenConverter()); 7 } 8 9 @Bean 10 public JwtAccessTokenConverter jwtAccessTokenConverter() { 11 JwtAccessTokenConverter accessTokenConverter = new JwtAccessTokenConverter(); 12 accessTokenConverter.setSigningKey("entfrm"); //对称加密key 13 return accessTokenConverter; 14 } 15 16 @Bean 17 public TokenEnhancer tokenEnhancer() { 18 return new JWTTokenEnhancer(); // token增强 19 } 20}

JwtAccessTokenConverter:TokenEnhancer的子类,帮助程序在JWT编码的令牌值和OAuth身份验证信息之间进行转换。 此处定义token 签名的方式,采用对称加密方式。

增加JwtTokenEnhancer类

1public class JWTTokenEnhancer implements TokenEnhancer { 2 3 @Override 4 public OAuth2AccessToken enhance(OAuth2AccessToken oAuth2AccessToken, OAuth2Authentication oAuth2Authentication) { 5 Map<String, Object> info = new HashMap<>(); 6 info.put("license", "entfrm"); 7 ((DefaultOAuth2AccessToken) oAuth2AccessToken).setAdditionalInformation(info); 8 //设置token的过期时间120分钟 9 Calendar nowTime = Calendar.getInstance(); 10 nowTime.add(Calendar.MINUTE, 120); 11 ((DefaultOAuth2AccessToken) oAuth2AccessToken).setExpiration(nowTime.getTime()); 12 return oAuth2AccessToken; 13 } 14}

重写TokenEnhancer的enhance方法,根据个人需求实现关键字段注入到 JWT 中,方便资源服务器使用。在此处也可以定义token过期时间。

新增AuthorizationServerConfig类,继承AuthorizationServerConfigurerAdapter

1@Configuration 2@AllArgsConstructor 3@EnableAuthorizationServer 4public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { 5 6 private final AuthenticationManager authenticationManager; 7 private final EntfrmUserDetailService userDetailService; 8 private final TokenStore jwtTokenStore; 9 private final JwtAccessTokenConverter jwtAccessTokenConverter; 10 private final TokenEnhancer tokenEnhancer; 11 private final DataSource dataSource; 12 13 @Override 14 public void configure(AuthorizationServerEndpointsConfigurer endpoints) { 15 TokenEnhancerChain enhancerChain = new TokenEnhancerChain(); 16 List<TokenEnhancer> enhancers = new ArrayList<>(); 17 enhancers.add(tokenEnhancer); 18 enhancers.add(jwtAccessTokenConverter); 19 enhancerChain.setTokenEnhancers(enhancers); 20 21 endpoints.authenticationManager(authenticationManager) 22 .tokenStore(jwtTokenStore) 23 .tokenEnhancer(enhancerChain) 24 .accessTokenConverter(jwtAccessTokenConverter) 25 .userDetailsService(userDetailService) 26 .allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.POST);//允许 GET、POST 请求获取 token,即访问端点:oauth/token 27 28 endpoints.reuseRefreshTokens(true);//oauth2登录异常处理 29 endpoints.exceptionTranslator(new EntfrmWebResponseExceptionTranslator());//oauth2登录异常处理 30 } 31 32 @Override 33 public void configure(AuthorizationServerSecurityConfigurer oauthServer) { 34 oauthServer 35 .checkTokenAccess("isAuthenticated()") 36 .allowFormAuthenticationForClients();//允许表单认证 37 } 38 39 @Override 40 public void configure(ClientDetailsServiceConfigurer clients) throws Exception { 41 clients.withClientDetails(clientDetails()); 42 } 43 44 @Bean 45 public ClientDetailsService clientDetails() { 46 return new JdbcClientDetailsService(dataSource);//客户端配置 使用jdbc数据库存储 47 } 48}

endpoints的tokenEnhancer方法需要我们提供一个token增强器链对象TokenEnhancerChain,所以我们需要在链中加入我们重写的TokenEnhancer和jwtAccessTokenConverter,然后放入endpoints。同时我们将客户端配置放到了jdbc数据库中,方便多种客户端的扩展,这儿需要在数据库中创建一张表oauth_client_details,表sql脚本如下:

1CREATE TABLE `oauth_client_details` ( 2 `client_id` varchar(48) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 3 `resource_ids` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 4 `client_secret` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 5 `scope` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 6 `authorized_grant_types` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 7 `web_server_redirect_uri` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 8 `authorities` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 9 `access_token_validity` int(11) NULL DEFAULT NULL, 10 `refresh_token_validity` int(11) NULL DEFAULT NULL, 11 `additional_information` varchar(4096) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 12 `autoapprove` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 13 PRIMARY KEY (`client_id`) USING BTREE 14) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

以上就是OAuth 授权服务器配置。

启动项目 查看效果

获取token 解析token

从图中我们可以看到返回的token中携带了我们加入的扩展信息license,以及授权信息。

源码地址

下载源码 关注我

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )