0

0

为Spring OAuth2资源服务器中的特定端点添加自定义Token授权

霞舞

霞舞

发布时间:2025-08-23 11:02:13

|

1020人浏览过

|

来源于php中文网

原创

为spring oauth2资源服务器中的特定端点添加自定义token授权

本文档阐述了如何在Spring OAuth2资源服务器中,针对特定端点实现自定义Token授权方案。重点介绍了利用JWT (JSON Web Token) 的方式,通过Keycloak配置,将自定义的授权信息添加到Token中,并在资源服务器端进行验证。同时,也探讨了使用客户端凭据流 (Client Credentials Flow) 为受信任的客户端进行授权的方法。

基于JWT的自定义Token授权方案

在标准的OAuth2流程中,资源服务器通常依赖于JWT中的信息进行授权。为了实现特定端点的自定义授权,我们可以利用Keycloak的mapper功能,将额外的授权信息添加到JWT中。

1. 在Keycloak中配置Mapper:

Keycloak的Mapper允许我们在用户登录时,将自定义的信息添加到access token中。例如,我们可以创建一个REST API来暴露订阅数据 (GET请求,返回给定用户订阅了什么,以及有效期至何时)。然后,在Keycloak中声明一个“confidential”客户端,使用client-credentials进行身份验证,并拥有访问此数据的专用角色。接下来,创建一个Keycloak mapper,在用户登录时查询此端点,并将返回的值作为私有声明添加到access token中。

参考示例项目: https://www.php.cn/link/68090119a695209306eefe7f69ebf574

2. 自定义AbstractAuthenticationToken:

在资源服务器端,我们需要创建一个自定义的AbstractAuthenticationToken实现,用于解析JWT中的自定义声明,并将其用于授权决策。这可以通过覆盖jwtAuthenticationConverter bean来实现,返回我们自定义的AbstractAuthenticationToken实现,而不是默认的JwtAuthenticationToken。

参考示例项目: https://www.php.cn/link/666108a9094a0ec0f62ca61a2eb74538

3. 使用@PreAuthorize进行授权:

有了自定义的AbstractAuthenticationToken,我们就可以在@PreAuthorize注解中使用自定义的表达式进行授权。例如:

@PreAuthorize("is(#username) or isNice() or onBehalfOf(#username).can('GREET')")

其中,is(#username)、isNice()、onBehalfOf(#username).can('GREET')都是自定义的表达式,它们可以访问自定义AbstractAuthenticationToken中包含的信息,并进行授权决策。

使用Client Credentials Flow进行授权

对于不需要用户上下文的受信任客户端,我们可以使用Client Credentials Flow进行授权。

MyMap AI
MyMap AI

使用AI将想法转化为图表

下载

1. 在Keycloak中配置客户端:

在Keycloak中,为每个受信任的客户端声明一个“confidential”客户端,并启用client credentials。为这些客户端分配所需的角色。

2. 客户端获取Access Token:

客户端使用client credentials向授权服务器请求access token,并将access token作为Bearer authorization header发送给资源服务器。

3. 资源服务器验证Access Token:

从资源服务器的角度来看,所有请求都将使用相同的授权服务器颁发的access token进行授权,没有区别

示例代码 (Spring Security配置):

@EnableWebSecurity
class WebSecurityConfiguration {
    @Bean
    fun filterChain(http: HttpSecurity): SecurityFilterChain {
        http.authorizeRequests()
            .antMatchers("/actuator/health").permitAll()
            .antMatchers("/api/custom/players").access("hasAuthority('ROLE_PLAYERS')") // 使用角色进行授权
            .antMatchers("/**").hasAnyRole("User", "Client")
            .anyRequest().authenticated()
            .and()
            .oauth2ResourceServer()
            .jwt()
            .jwtAuthenticationConverter(jwtAuthenticationConverter())
        return http.build()
    }

    private fun jwtAuthenticationConverter(): Converter {
        val jwtConverter = JwtAuthenticationConverter()
        jwtConverter.setJwtGrantedAuthoritiesConverter(KeycloakRealmRoleConverter())
        return jwtConverter
    }
}

注意事项:

  • 确保Keycloak中的Mapper配置正确,能够将所需的授权信息添加到JWT中。
  • 自定义AbstractAuthenticationToken的实现需要考虑到性能和安全性。
  • 在使用Client Credentials Flow时,需要仔细配置客户端的权限,以防止未授权访问。

总结:

通过结合Keycloak的Mapper功能和Spring Security的@PreAuthorize注解,我们可以实现灵活的自定义Token授权方案,满足不同场景下的授权需求。无论是基于用户上下文的授权,还是基于客户端凭据的授权,都可以通过本文介绍的方法来实现。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

94

2025.08.06

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

400

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

528

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

305

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

67

2025.09.10

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6023

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

777

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1042

2023.12.21

苹果官网入口直接访问
苹果官网入口直接访问

苹果官网直接访问入口是https://www.apple.com/cn/,该页面具备0.8秒首屏渲染、HTTP/3与Brotli加速、WebP+AVIF双格式图片、免登录浏览全参数等特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

10

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 2.2万人学习

Git版本控制工具
Git版本控制工具

共8课时 | 1.5万人学习

Git中文开发手册
Git中文开发手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号