Spring Security OAuth 2.0如何实现细粒度权限控制?

2026-05-21 04:243阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计2632个文字,预计阅读时间需要11分钟。

Spring Security OAuth 2.0如何实现细粒度权限控制?

OAuth 2.0 提供商实现解析:在 OAuth 2.0 中,提供者角色负责将授权服务和资源服务分离。有时,它们可能在同一个应用中,使用 Spring Security OAuth,你可以选择将它们分割成两个应用,以管理多个资源。

OAuth 2.0 Provider 实现

在OAuth 2.0中,provider角色事实上是把授权服务和资源服务分开,有时候它们也可能在同一个应用中,用Spring Security OAuth你可以选择把它们分成两个应用,当然多个资源服务可以共享同一个授权服务。

 

获取token的请求由Spring MVC的控制端点处理,访问受保护的资源由标准的Spring Security请求过滤器处理。

 

为了实现OAuth 2.0授权服务器,在Spring Security的过滤器链中需要有以下端点:

  • AuthorizationEndpoint:用于服务授权请求。默认URL是/oauth/authorize
  • TokenEndpoint:用于服务访问令牌请求。默认URL是/oauth/token

在OAuth 2.0的资源服务器中需要实现下列过滤器:

  • OAuth2AuthenticationProcessingFilter:用于加载认证

对于所有的OAuth 2.0 provider特性,最简单的配置是用Spring OAuth @Configuration适配器。

Authorization Server 配置

只要你配置了授权服务器,那么你应该考虑客户端用于获取access token的授权类型(例如,授权码,用户凭证,刷新token)。

 

服务器的配置是用来提供client detail服务和token服务的,并且可以启用或者禁用全局的某些机制。

 

每个客户端可以配置不同的权限 @EnableAuthorizationServer注解被用来配置授权服务器,也可以和实现了AuthorizationServerConfigurer接口的任意被标记为@Bean的Bean一起来对授权服务器进行配置。

 

下列特性被委托给AuthorizationServerConfigurer:

  • ClientDetailsServiceConfigurer:定义客户端详细信息服务的配置(a configurer that defines the client details service)
  • AuthorizationServerSecurityConfigurer:定义令牌终结点上的安全约束(defines the security constraints on the token endpoint)
  • AuthorizationServerEndpointsConfigurer:定义授权和令牌端点以及令牌服务(defines the authorization and token endpoints and the token services)

一件重要的事情是,provider配置了将授权码给OAuth客户端的方式(PS:在授权码类型授权过程中)

 

OAuth客户端通过将end-user(最终用户)导向授权页,用户可用在此输入他的凭证。之后,授权服务器携带授权码通过重定向的方式将授权码返回给客户端。

配置 Client Details

ClientDetailsServiceConfigurer可用使用client details service的两种实现中的任意一种:in-memory 或者 JDBC

客户端重要的属性是:

  • clientId:(必须的)客户端ID
  • secret:(对于信任的客户端需要)客户端秘钥
  • scope:客户端被限定的范围。如果scope为定义或者为空(默认为空)则客户端不受scope限制
  • authorizedGrantTypes:客户端使用到的授权类型
  • authorities:授予客户端的权限

客户端details可以在应用运行时被更新,通过直接访问存储(例如:如果用JdbcClientDetailsService的话可以实时改变数据库表中的数据)或者通过实现ClientDetailsManager接口(它们也都实现了ClientDetailsService接口)。

 

注意:用于JDBC服务的数据库schema并没有打包到library中(因为你再实际使用的时候可能有诸多差异),但是这里有一个例子你可以参考一下。

 

spring-security-oauth官方表结构文件:github.com/spring-projects/spring-security-oauth/blob/main/spring-security-oauth2/src/test/resources/schema.sql

客户端详细信息表:oauth_client_details

对oauth_client_details的操作主要集中在JdbcClientDetailsService.java中

create table oauth_client_details ( client_id VARCHAR(256) PRIMARY KEY, resource_ids VARCHAR(256), client_secret VARCHAR(256), scope VARCHAR(256), authorized_grant_types VARCHAR(256), web_server_redirect_uri VARCHAR(256), authorities VARCHAR(256), access_token_validity INTEGER, refresh_token_validity INTEGER, additional_information VARCHAR(4096), autoapprove VARCHAR(256) ); 字段 注释 client_id 主键,客户端ID resource_ids 客户端所能访问的资源id集合,多个资源时用逗号(,)分隔 client_secret 客户端访问密匙 scope 客户端申请的权限范围,可选值包括read,write,trust;若有多个权限范围用逗号(,)分隔 authorized_grant_types 客户端支持的授权许可类型(grant_type),可选值包括authorization_code,password,refresh_token,implicit,client_credentials,若支持多个授权许可类型用逗号(,)分隔 web_server_redirect_uri 客户端重定向URI,当grant_type为authorization_code或implicit时, 在Oauth的流程中会使用并检查与数据库内的redirect_uri是否一致 authorities 客户端所拥有的Spring Security的权限值,可选, 若有多个权限值,用逗号(,)分隔 access_token_validity 设定客户端的access_token的有效时间值(单位:秒),若不设定值则使用默认的有效时间值(60 * 60 * 12, 12小时) refresh_token_validity 设定客户端的refresh_token的有效时间值(单位:秒),若不设定值则使用默认的有效时间值(60 * 60 * 24 * 30, 30天) additional_information 这是一个预留的字段,在Oauth的流程中没有实际的使用,可选,但若设置值,必须是JSON格式的数据 create_time 记录创建时间 autoapprove 设置用户是否自动批准授予权限操作, 默认值为 ‘false’, 可选值包括 ‘true’,‘false’, ‘read’,‘write’

客户端系统中存储从服务端获取的token:oauth_client_token

该表用于在客户端系统中存储从服务端获取的token数据,

create table oauth_client_token ( token_id VARCHAR(256), token LONGVARBINARY, authentication_id VARCHAR(256) PRIMARY KEY, user_name VARCHAR(256), client_id VARCHAR(256) ); 字段 注释 token_id 从服务器端获取到的access_token的值 token 这是一个二进制的字段, 存储的数据是OAuth2AccessToken.java对象序列化后的二进制数据 authentication_id 该字段具有唯一性, 是根据当前的username(如果有),client_id与scope通过MD5加密生成的,具体实现请参考DefaultClientKeyGenerator.java类 user_name 登录时的用户名 client_id 主键,客户端ID create_time 数据的创建时间,精确到秒,由数据库在插入数据时取当前系统时间自动生成(扩展字段)

认证授权Token记录表:oauth_access_token

对oauth_access_token表的操作主要集中在JdbcTokenStore.java中

create table oauth_access_token ( token_id VARCHAR(256), token LONGVARBINARY, authentication_id VARCHAR(256) PRIMARY KEY, user_name VARCHAR(256), client_id VARCHAR(256), authentication LONGVARBINARY, refresh_token VARCHAR(256) ); 字段 注释 client_id 认证授权客户端ID token_id Token标识:通过MD5加密access_token的值 token OAuth2AccessToken.java对象序列化内容 user_name 用户名,若客户端没有用户名则该值等于client_id authentication_id 根据当前的username、client_id与scope通过MD5加密生成该字段的值 authentication OAuth2Authentication.java对象序列化内容 refresh_token RefreshToken标识:通过MD5加密refresh_token的值 create_time 记录创建时间

刷新授权Token记录表:oauth_refresh_token

对oauth_refresh_token的操作主要集中在JdbcTokenStore.java中

create table oauth_refresh_token ( token_id VARCHAR(256), token LONGVARBINARY, authentication LONGVARBINARY ); 字段 注释 token_id RefreshToken标识:通过MD5加密refresh_token的值 token OAuth2RefreshToken.java对象序列化内容 authentication OAuth2Authentication.java对象序列化内容 create_time 记录创建时间

授权码Code记录表:oauth_code

对oauth_code的操作主要集中在JdbcAuthorizationCodeServices.java中

create table oauth_code ( code VARCHAR(256), authentication LONGVARBINARY ); 字段 注释 authentication AuthorizationRequestHolder.java对象序列化内容 code 存储服务端系统生成的code的值(未加密)

授权记录:oauth_approvals

create table oauth_approvals ( userId VARCHAR(256), clientId VARCHAR(256), scope VARCHAR(256), status VARCHAR(10), expiresAt TIMESTAMP, lastModifiedAt TIMESTAMP ); 字段 注释 userId 登录的用户名 clientId 客户端ID scope 申请的权限范围 status 状态(Approve或Deny) expiresAt 过期时间 lastModifiedAt 最终修改时间

自定义customized oauth_client_details表

-- customized oauth_client_details table create table ClientDetails ( appId VARCHAR(256) PRIMARY KEY, resourceIds VARCHAR(256), appSecret VARCHAR(256), scope VARCHAR(256), grantTypes VARCHAR(256), redirectUrl VARCHAR(256), authorities VARCHAR(256), access_token_validity INTEGER, refresh_token_validity INTEGER, additionalInformation VARCHAR(4096), autoApproveScopes VARCHAR(256) );

管理Tokens

AuthorizationServerTokenServices定义了管理OAuth 2.0 Token所必须的操作。请注意:

  • 当创建一个access token的时候,这个认证必须被存储起来,以便后续访问资源的时候对接收到的access token进行引用校验。
  • access token用来加载认证

当你实现了AuthorizationServerTokenServices接口,你可能考虑用DefaultTokenServices。有许多内置的插件化的策略可以用来改变access token的格式和存储。

 

默认情况下,用随机值来生成token,并且用TokenService来处理所有(除了token持久化以外)事情。默认的存储是in-memory实现,但是有其它的实现可以使用。

  • 对于单服务器而言,默认的InMemoryTokenStore是完美的。大多数的项目是从这里开始的,为了使它很容易启动,也不需要其它依赖,并且可能以开发模式进行操作。

  • JdbcTokenStore是JDBC版本的Token存储。它把Token数据存储到关系型数据库中。为了使用JdbcTokenStore需要classpath下有"spring-jdbc"。

  • JSON Web Token (JWT) 它将授权的token的所有数据进行编码后存储(没有使用后端存储是它最大的优势)。这种方式的一个缺点是你不能很容易的撤销一个access token,因此一般用该方式存储的token的有效期很短,并且在刷新token的时候之前的token会被废除。另一个缺点是,token很长,因为它里面存了很多关于用户凭证的信息。JwtTokenStore不会真的存储数据,它不持久化任何数据。但是在DefaultTokenServices中,它扮演着token值和认证信息转换的角色。

注意:对于JDBC的schema没有打包到library中,但是这儿有一个例子你可以参考一下test code in github。确保用@EnableTransactionManagement来防止多个客户端在同一行创建token。注意,示例中的schema都有明确地主键声明,在并发环境中这是必须的。

JWT Tokens

为了使用JWT Tokens,你需要在你的授权服务器中有一个JwtTokenStore。资源服务器也需要解码这个token,所以JwtTokenStore有一个依赖JwtAccessTokenConverter,相同的实现需要被包含在授权服务器和资源服务器中。也就是说,授权服务器和资源服务器中都需要JwtTokenStore实现。默认情况下,token是被签名的,而且资源服务器必须能够校验这个签名,因此需要有相同的对称key,或者需要公钥来匹配授权服务器上的私钥。公钥被授权服务器暴露在/oauth/token_key端点,默认情况下这个端点的访问规则是"denyAll()"。你可以用标准的SpEL表达式(例如:permitAll())到AuthorizationServerSecurityConfigurer来开放它。

 

为了使用JwtTokenStore,在classpath下需要有"spring-security-jwt"

Grant Types

授权类型通过AuthorizationEndpoint来支持。默认情况下,除了password以外,所有授权类型都支持。下面是授权类型的一些属性:

Spring Security OAuth 2.0如何实现细粒度权限控制?

  • authenticationManager:通过注入一个AuthenticationManager来切换成password授权
  • userDetailsService:如果你注入一个UserDetailsService或者以任意方式配置了一个全局的UserDetailsService(例如:在GlobalAuthenticationManagerConfigurer中),那么一个刷新token将被包含在user detail中,为了强制账户是激活的。
  • authorizationCodeServices:定义授权码服务(AuthorizationCodeServices的实例)
  • implicitGrantService:在隐式授权期间管理状态
  • tokenGranter:tokenGranter

Configuring the Endpoint URLs

AuthorizationServerEndpointsConfigurer有一个pathMapping()方法。它有两个参数:

  • 端点的默认URL路径
  • 自定义的路径(必须以"/"开头)

下面是框架提供的URL路径:

  • /oauth/authorize:授权端点
  • /oauth/token:令牌端点
  • /oauth/confirm_access:用户批准授权的端点
  • /oauth/error:用于渲染授权服务器的错误
  • /oauth/check_token:资源服务器解码access token
  • /oauth/check_token:当使用JWT的时候,暴露公钥的端点

授权端点/oauth/authorize应该被保护起来,以至于它只能被认证过的用户访问。下面是一个例子,用标准的Spring Security WebSecurityConfigurer :

@Override protected void configure(HttpSecurity projects.spring.io/spring-security-oauth/docs/oauth2.html

www.cnblogs.com/cjsblog/p/9184173.html

blog.csdn.net/yangxiao_hui/article/details/109100140

本文共计2632个文字,预计阅读时间需要11分钟。

Spring Security OAuth 2.0如何实现细粒度权限控制?

OAuth 2.0 提供商实现解析:在 OAuth 2.0 中,提供者角色负责将授权服务和资源服务分离。有时,它们可能在同一个应用中,使用 Spring Security OAuth,你可以选择将它们分割成两个应用,以管理多个资源。

OAuth 2.0 Provider 实现

在OAuth 2.0中,provider角色事实上是把授权服务和资源服务分开,有时候它们也可能在同一个应用中,用Spring Security OAuth你可以选择把它们分成两个应用,当然多个资源服务可以共享同一个授权服务。

 

获取token的请求由Spring MVC的控制端点处理,访问受保护的资源由标准的Spring Security请求过滤器处理。

 

为了实现OAuth 2.0授权服务器,在Spring Security的过滤器链中需要有以下端点:

  • AuthorizationEndpoint:用于服务授权请求。默认URL是/oauth/authorize
  • TokenEndpoint:用于服务访问令牌请求。默认URL是/oauth/token

在OAuth 2.0的资源服务器中需要实现下列过滤器:

  • OAuth2AuthenticationProcessingFilter:用于加载认证

对于所有的OAuth 2.0 provider特性,最简单的配置是用Spring OAuth @Configuration适配器。

Authorization Server 配置

只要你配置了授权服务器,那么你应该考虑客户端用于获取access token的授权类型(例如,授权码,用户凭证,刷新token)。

 

服务器的配置是用来提供client detail服务和token服务的,并且可以启用或者禁用全局的某些机制。

 

每个客户端可以配置不同的权限 @EnableAuthorizationServer注解被用来配置授权服务器,也可以和实现了AuthorizationServerConfigurer接口的任意被标记为@Bean的Bean一起来对授权服务器进行配置。

 

下列特性被委托给AuthorizationServerConfigurer:

  • ClientDetailsServiceConfigurer:定义客户端详细信息服务的配置(a configurer that defines the client details service)
  • AuthorizationServerSecurityConfigurer:定义令牌终结点上的安全约束(defines the security constraints on the token endpoint)
  • AuthorizationServerEndpointsConfigurer:定义授权和令牌端点以及令牌服务(defines the authorization and token endpoints and the token services)

一件重要的事情是,provider配置了将授权码给OAuth客户端的方式(PS:在授权码类型授权过程中)

 

OAuth客户端通过将end-user(最终用户)导向授权页,用户可用在此输入他的凭证。之后,授权服务器携带授权码通过重定向的方式将授权码返回给客户端。

配置 Client Details

ClientDetailsServiceConfigurer可用使用client details service的两种实现中的任意一种:in-memory 或者 JDBC

客户端重要的属性是:

  • clientId:(必须的)客户端ID
  • secret:(对于信任的客户端需要)客户端秘钥
  • scope:客户端被限定的范围。如果scope为定义或者为空(默认为空)则客户端不受scope限制
  • authorizedGrantTypes:客户端使用到的授权类型
  • authorities:授予客户端的权限

客户端details可以在应用运行时被更新,通过直接访问存储(例如:如果用JdbcClientDetailsService的话可以实时改变数据库表中的数据)或者通过实现ClientDetailsManager接口(它们也都实现了ClientDetailsService接口)。

 

注意:用于JDBC服务的数据库schema并没有打包到library中(因为你再实际使用的时候可能有诸多差异),但是这里有一个例子你可以参考一下。

 

spring-security-oauth官方表结构文件:github.com/spring-projects/spring-security-oauth/blob/main/spring-security-oauth2/src/test/resources/schema.sql

客户端详细信息表:oauth_client_details

对oauth_client_details的操作主要集中在JdbcClientDetailsService.java中

create table oauth_client_details ( client_id VARCHAR(256) PRIMARY KEY, resource_ids VARCHAR(256), client_secret VARCHAR(256), scope VARCHAR(256), authorized_grant_types VARCHAR(256), web_server_redirect_uri VARCHAR(256), authorities VARCHAR(256), access_token_validity INTEGER, refresh_token_validity INTEGER, additional_information VARCHAR(4096), autoapprove VARCHAR(256) ); 字段 注释 client_id 主键,客户端ID resource_ids 客户端所能访问的资源id集合,多个资源时用逗号(,)分隔 client_secret 客户端访问密匙 scope 客户端申请的权限范围,可选值包括read,write,trust;若有多个权限范围用逗号(,)分隔 authorized_grant_types 客户端支持的授权许可类型(grant_type),可选值包括authorization_code,password,refresh_token,implicit,client_credentials,若支持多个授权许可类型用逗号(,)分隔 web_server_redirect_uri 客户端重定向URI,当grant_type为authorization_code或implicit时, 在Oauth的流程中会使用并检查与数据库内的redirect_uri是否一致 authorities 客户端所拥有的Spring Security的权限值,可选, 若有多个权限值,用逗号(,)分隔 access_token_validity 设定客户端的access_token的有效时间值(单位:秒),若不设定值则使用默认的有效时间值(60 * 60 * 12, 12小时) refresh_token_validity 设定客户端的refresh_token的有效时间值(单位:秒),若不设定值则使用默认的有效时间值(60 * 60 * 24 * 30, 30天) additional_information 这是一个预留的字段,在Oauth的流程中没有实际的使用,可选,但若设置值,必须是JSON格式的数据 create_time 记录创建时间 autoapprove 设置用户是否自动批准授予权限操作, 默认值为 ‘false’, 可选值包括 ‘true’,‘false’, ‘read’,‘write’

客户端系统中存储从服务端获取的token:oauth_client_token

该表用于在客户端系统中存储从服务端获取的token数据,

create table oauth_client_token ( token_id VARCHAR(256), token LONGVARBINARY, authentication_id VARCHAR(256) PRIMARY KEY, user_name VARCHAR(256), client_id VARCHAR(256) ); 字段 注释 token_id 从服务器端获取到的access_token的值 token 这是一个二进制的字段, 存储的数据是OAuth2AccessToken.java对象序列化后的二进制数据 authentication_id 该字段具有唯一性, 是根据当前的username(如果有),client_id与scope通过MD5加密生成的,具体实现请参考DefaultClientKeyGenerator.java类 user_name 登录时的用户名 client_id 主键,客户端ID create_time 数据的创建时间,精确到秒,由数据库在插入数据时取当前系统时间自动生成(扩展字段)

认证授权Token记录表:oauth_access_token

对oauth_access_token表的操作主要集中在JdbcTokenStore.java中

create table oauth_access_token ( token_id VARCHAR(256), token LONGVARBINARY, authentication_id VARCHAR(256) PRIMARY KEY, user_name VARCHAR(256), client_id VARCHAR(256), authentication LONGVARBINARY, refresh_token VARCHAR(256) ); 字段 注释 client_id 认证授权客户端ID token_id Token标识:通过MD5加密access_token的值 token OAuth2AccessToken.java对象序列化内容 user_name 用户名,若客户端没有用户名则该值等于client_id authentication_id 根据当前的username、client_id与scope通过MD5加密生成该字段的值 authentication OAuth2Authentication.java对象序列化内容 refresh_token RefreshToken标识:通过MD5加密refresh_token的值 create_time 记录创建时间

刷新授权Token记录表:oauth_refresh_token

对oauth_refresh_token的操作主要集中在JdbcTokenStore.java中

create table oauth_refresh_token ( token_id VARCHAR(256), token LONGVARBINARY, authentication LONGVARBINARY ); 字段 注释 token_id RefreshToken标识:通过MD5加密refresh_token的值 token OAuth2RefreshToken.java对象序列化内容 authentication OAuth2Authentication.java对象序列化内容 create_time 记录创建时间

授权码Code记录表:oauth_code

对oauth_code的操作主要集中在JdbcAuthorizationCodeServices.java中

create table oauth_code ( code VARCHAR(256), authentication LONGVARBINARY ); 字段 注释 authentication AuthorizationRequestHolder.java对象序列化内容 code 存储服务端系统生成的code的值(未加密)

授权记录:oauth_approvals

create table oauth_approvals ( userId VARCHAR(256), clientId VARCHAR(256), scope VARCHAR(256), status VARCHAR(10), expiresAt TIMESTAMP, lastModifiedAt TIMESTAMP ); 字段 注释 userId 登录的用户名 clientId 客户端ID scope 申请的权限范围 status 状态(Approve或Deny) expiresAt 过期时间 lastModifiedAt 最终修改时间

自定义customized oauth_client_details表

-- customized oauth_client_details table create table ClientDetails ( appId VARCHAR(256) PRIMARY KEY, resourceIds VARCHAR(256), appSecret VARCHAR(256), scope VARCHAR(256), grantTypes VARCHAR(256), redirectUrl VARCHAR(256), authorities VARCHAR(256), access_token_validity INTEGER, refresh_token_validity INTEGER, additionalInformation VARCHAR(4096), autoApproveScopes VARCHAR(256) );

管理Tokens

AuthorizationServerTokenServices定义了管理OAuth 2.0 Token所必须的操作。请注意:

  • 当创建一个access token的时候,这个认证必须被存储起来,以便后续访问资源的时候对接收到的access token进行引用校验。
  • access token用来加载认证

当你实现了AuthorizationServerTokenServices接口,你可能考虑用DefaultTokenServices。有许多内置的插件化的策略可以用来改变access token的格式和存储。

 

默认情况下,用随机值来生成token,并且用TokenService来处理所有(除了token持久化以外)事情。默认的存储是in-memory实现,但是有其它的实现可以使用。

  • 对于单服务器而言,默认的InMemoryTokenStore是完美的。大多数的项目是从这里开始的,为了使它很容易启动,也不需要其它依赖,并且可能以开发模式进行操作。

  • JdbcTokenStore是JDBC版本的Token存储。它把Token数据存储到关系型数据库中。为了使用JdbcTokenStore需要classpath下有"spring-jdbc"。

  • JSON Web Token (JWT) 它将授权的token的所有数据进行编码后存储(没有使用后端存储是它最大的优势)。这种方式的一个缺点是你不能很容易的撤销一个access token,因此一般用该方式存储的token的有效期很短,并且在刷新token的时候之前的token会被废除。另一个缺点是,token很长,因为它里面存了很多关于用户凭证的信息。JwtTokenStore不会真的存储数据,它不持久化任何数据。但是在DefaultTokenServices中,它扮演着token值和认证信息转换的角色。

注意:对于JDBC的schema没有打包到library中,但是这儿有一个例子你可以参考一下test code in github。确保用@EnableTransactionManagement来防止多个客户端在同一行创建token。注意,示例中的schema都有明确地主键声明,在并发环境中这是必须的。

JWT Tokens

为了使用JWT Tokens,你需要在你的授权服务器中有一个JwtTokenStore。资源服务器也需要解码这个token,所以JwtTokenStore有一个依赖JwtAccessTokenConverter,相同的实现需要被包含在授权服务器和资源服务器中。也就是说,授权服务器和资源服务器中都需要JwtTokenStore实现。默认情况下,token是被签名的,而且资源服务器必须能够校验这个签名,因此需要有相同的对称key,或者需要公钥来匹配授权服务器上的私钥。公钥被授权服务器暴露在/oauth/token_key端点,默认情况下这个端点的访问规则是"denyAll()"。你可以用标准的SpEL表达式(例如:permitAll())到AuthorizationServerSecurityConfigurer来开放它。

 

为了使用JwtTokenStore,在classpath下需要有"spring-security-jwt"

Grant Types

授权类型通过AuthorizationEndpoint来支持。默认情况下,除了password以外,所有授权类型都支持。下面是授权类型的一些属性:

Spring Security OAuth 2.0如何实现细粒度权限控制?

  • authenticationManager:通过注入一个AuthenticationManager来切换成password授权
  • userDetailsService:如果你注入一个UserDetailsService或者以任意方式配置了一个全局的UserDetailsService(例如:在GlobalAuthenticationManagerConfigurer中),那么一个刷新token将被包含在user detail中,为了强制账户是激活的。
  • authorizationCodeServices:定义授权码服务(AuthorizationCodeServices的实例)
  • implicitGrantService:在隐式授权期间管理状态
  • tokenGranter:tokenGranter

Configuring the Endpoint URLs

AuthorizationServerEndpointsConfigurer有一个pathMapping()方法。它有两个参数:

  • 端点的默认URL路径
  • 自定义的路径(必须以"/"开头)

下面是框架提供的URL路径:

  • /oauth/authorize:授权端点
  • /oauth/token:令牌端点
  • /oauth/confirm_access:用户批准授权的端点
  • /oauth/error:用于渲染授权服务器的错误
  • /oauth/check_token:资源服务器解码access token
  • /oauth/check_token:当使用JWT的时候,暴露公钥的端点

授权端点/oauth/authorize应该被保护起来,以至于它只能被认证过的用户访问。下面是一个例子,用标准的Spring Security WebSecurityConfigurer :

@Override protected void configure(HttpSecurity projects.spring.io/spring-security-oauth/docs/oauth2.html

www.cnblogs.com/cjsblog/p/9184173.html

blog.csdn.net/yangxiao_hui/article/details/109100140