SpringSecurityOAuth已停更,来看一看进化版本Spring Authorization Server

article/2025/10/12 6:49:44

Spring Authorization Server是Spring Security OAuth的进化版本,Spring Security OAuth官方已经宣布“End of Life”了。Spring Security OAuth使用的是OAuth2.0标准而Spring Authorization Serve引入了对OAuth 2.1和OpenID Connect 1.0规范的支持,并提供了更多功能和改进。它提供了OAuth 2.1和OpenID Connect 1.0规范以及其他相关规范的实现。它是基于Spring Security构建的,为构建OpenID Connect 1.0身份提供者和OAuth2授权服务器产品提供了安全、轻量级和可定制的基础。

OAuth 2.1和OpenID Connect 1.0是用于身份验证和授权的行业标准协议。它们被广泛应用于各种应用程序和系统,以实现安全的用户身份验证和授权流程。Spring Authorization Server提供了一个方便的方式来实现这些协议,使开发人员能够快速构建安全可靠的身份验证和授权系统。

在本教程中,我们将介绍如何使用 Spring Boot 快速入门 Spring Authorization Server。

系统要求

在开始之前,您需要确保满足以下系统要求:

  • Java 17 或更高版本的运行时环境。

安装 Spring Authorization Server

首先,我们需要创建一个基于 Spring Boot 的项目,并添加 Spring Authorization Server 的依赖。

  1. 打开 start.spring.io,选择所需的项目配置,例如项目语言、构建工具和依赖管理器。
  2. 在依赖搜索框中输入 "spring-boot-starter-oauth2-authorization-server",并添加该依赖。
  • Maven
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-oauth2-authorization-server</artifactId>
</dependency>
  • Gradle
implementation "org.springframework.security:spring-security-oauth2-authorization-server"

官方的版本可以选择1.1.0

  1. 下载生成的项目代码,并导入到您的开发环境中。

配置 Spring Authorization Server

一旦您的项目设置完毕,接下来需要进行一些配置以启用 Spring Authorization Server。

  1. 打开项目的 application.yml 文件。
  2. 添加以下配置内容:
server:port: 9000logging:level:org.springframework.security: tracespring:security:oauth2:authorizationserver:client:oidc-client:registration:client-id: "oidc-client"client-secret: "{noop}secret"client-authentication-methods:- "client_secret_basic"authorization-grant-types:- "authorization_code"- "refresh_token"- "client_credentials"redirect-uris:- "http://127.0.0.1:8080/login/oauth2/code/oidc-client"post-logout-redirect-uris:- "http://127.0.0.1:8080/"scopes:- "openid"- "profile"require-authorization-consent: true

以上配置包含了一些必要的属性,例如服务器端口、客户端配置和授权相关设置。您可以根据自己的需求进行自定义配置。

开发您的第一个应用程序

现在,您可以开始编写您的第一个 Spring Authorization Server 应用程序了。

  1. 创建一个新的 Java 类,例如 AuthorizationServerConfig。
  2. 在类上添加 @Configuration 和 @EnableWebSecurity 注解。
  3. 定义以下必要的组件作为 @Bean:
@Configuration
@EnableWebSecurity
public class SecurityConfig {/*** 配置授权服务相关端点* 负责处理与授权服务器相关的安全配置*  */@Bean @Order(1)public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http)throws Exception {OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http);http.getConfigurer(OAuth2AuthorizationServerConfigurer.class).oidc(Customizer.withDefaults());	// 启用 OpenID Connect 1.0http// 当未经过身份验证时,重定向到登录页面.exceptionHandling((exceptions) -> exceptions.defaultAuthenticationEntryPointFor(new LoginUrlAuthenticationEntryPoint("/login"),new MediaTypeRequestMatcher(MediaType.TEXT_HTML)))// 接受访问令牌用于用户信息和/或客户端注册.oauth2ResourceServer((resourceServer) -> resourceServer.jwt(Customizer.withDefaults()));return http.build();}/*** 配置资源相关端点* 通用的过滤器链,用于处理整个应用程序的安全配置*/@Bean @Order(2)public SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http)throws Exception {http.authorizeHttpRequests((authorize) -> authorize.anyRequest().authenticated())// 表单登录处理授权服务器过滤器链的重定向.formLogin(Customizer.withDefaults());return http.build();}@Bean public UserDetailsService userDetailsService() {UserDetails userDetails = User.withDefaultPasswordEncoder().username("user").password("password").roles("USER").build();return new InMemoryUserDetailsManager(userDetails);}@Bean public RegisteredClientRepository registeredClientRepository() {RegisteredClient oidcClient = RegisteredClient.withId(UUID.randomUUID().toString()).clientId("oidc-client").clientSecret("{noop}secret").clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_BASIC).authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE).authorizationGrantType(AuthorizationGrantType.REFRESH_TOKEN).redirectUri("http://127.0.0.1:8080/login/oauth2/code/oidc-client").postLogoutRedirectUri("http://127.0.0.1:8080/").scope(OidcScopes.OPENID).scope(OidcScopes.PROFILE).clientSettings(ClientSettings.builder().requireAuthorizationConsent(true).build()).build();return new InMemoryRegisteredClientRepository(oidcClient);}//JWK是一种JSON格式的密钥表示,用于描述加密算法使用的密钥。//JWT使用JWK进行签名和验证,确保令牌的真实性和完整性。@Bean public JWKSource<SecurityContext> jwkSource() {KeyPair keyPair = generateRsaKey();RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();RSAKey rsaKey = new RSAKey.Builder(publicKey).privateKey(privateKey).keyID(UUID.randomUUID().toString()).build();JWKSet jwkSet = new JWKSet(rsaKey);return new ImmutableJWKSet<>(jwkSet);}private static KeyPair generateRsaKey() { KeyPair keyPair;try {KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");keyPairGenerator.initialize(2048);keyPair = keyPairGenerator.generateKeyPair();}catch (Exception ex) {throw new IllegalStateException(ex);}return keyPair;}@Bean public JwtDecoder jwtDecoder(JWKSource<SecurityContext> jwkSource) {return OAuth2AuthorizationServerConfiguration.jwtDecoder(jwkSource);}@Bean public AuthorizationServerSettings authorizationServerSettings() {return AuthorizationServerSettings.builder().build();}}

以上代码配置了 Spring Authorization Server 的一些必要组件,包括 HTTP 安全配置、密码编码器、认证管理器、JWT 访问令牌转换器、令牌存储和默认令牌服务。

  1. authorizationServerSecurityFilterChain用于协议端点的Spring Security过滤器链。 这个过滤器链用于处理与协议端点相关的请求和响应。它负责处理OAuth2和OpenID Connect的协议细节,例如授权请求、令牌颁发和验证等。
  2. defaultSecurityFilterChain用于身份验证的Spring Security过滤器链。 这个过滤器链用于处理身份验证相关的请求和响应。它负责验证用户的身份,并生成相应的凭据,以便后续的授权和访问控制。
  3. UserDetailsService的实例,用于获取需要进行身份验证的用户信息。 这个实例用于从用户存储中检索用户的详细信息,例如用户名、密码和权限等。它提供了与用户相关的数据,以便进行身份验证和授权的决策。
  4. RegisteredClientRepository的实例,用于管理客户端信息。 这个实例用于管理OAuth2和OpenID Connect客户端的注册信息,包括客户端ID、密钥、授权类型和重定向URI等。它负责验证客户端的身份并维护客户端的配置。
  5. com.nimbusds.jose.jwk.source.JWKSource的实例,用于对访问令牌进行签名。 这个实例用于生成和管理用于对访问令牌进行签名的JSON Web Key(JWK)。它提供了加密算法和密钥,以确保访问令牌的完整性和安全性。
  6. java.security.KeyPair的实例,用于在启动时生成密钥,并用于创建上述JWKSource。 这个实例用于生成公钥和私钥对,作为访问令牌签名所需的密钥材料。它提供了安全的密钥生成机制,以确保访问令牌的安全性和保密性。
  7. JwtDecoder的实例,用于解码已签名的访问令牌。 这个实例用于验证和解码已签名的访问令牌,以获取其中包含的授权信息和用户身份。它负责验证访问令牌的有效性和真实性。
  8. AuthorizationServerSettings的实例,用于配置Spring Authorization Server的设置。 这个实例用于配置Spring Authorization Server的一些全局设置,例如访问令牌的有效期、刷新令牌的策略和认证页面的URL等。它提供了对授权服务器行为的细粒度控制。

运行应用程序

现在,您已经完成了 Spring Authorization Server 的基本配置。您可以通过运行您的应用程序来启动服务器:

  1. 在项目中找到 Application 类,其中包含 main 方法。
  2. 运行 Application.main() 方法。

运行应用程序后,可以使用 OAuth 2.1 客户端来请求访问令牌,并使用访问令牌来访问受保护的资源。如:

  • 请求访问令牌:POST http://localhost:9000/oauth/token?grant_type=client_credentials&client_id=your_client_id&client_secret=your_client_secret
  • 使用访问令牌访问受保护的资源:GET http://localhost:9000/user?access_token=your_access_token

以上是一个简单的 Spring Boot OAuth 2.0 的 demo 示例,仅供参考。在实际开发中,需要根据具体业务需求和安全要求进行相应的配置和实现。

相关demo源代码

  • Spring Authorization Server官方demo(基于springboot)

https://github.com/spring-projects/spring-authorization-server/tree/main/samples#demo-sample

  • Spring Security官方demo(基于springboot)

https://github.com/spring-projects/spring-security-samples/tree/main/servlet/spring-boot/java/oauth2

运行效果

登录页面

  • 登录后主页面

通过授权码模式获取resource

通过Device Activation模式获取resource

====================================

如果文章对你有帮忙,请不要忘记加个关注、点个赞!必回关!!!


http://chatgpt.dhexx.cn/article/6GKcIGCn.shtml

相关文章

Spring Authorization Server1.0 介绍与使用

一、版本使用 1、Java&#xff1a;17或者更高的版本。 2、springboot 3.0 3、Spring Authorization Server 1.0版本。 <dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-oauth2-authorization-server</ar…

curl php authorization,PHP CURL 执行 Authorization 请求

PHP CURL 扩展可以帮助我们快速实现HTTP请求。查看更多: 博客原文 在使用豆瓣OAuth登录接口时&#xff0c;我们需要发送这样的HTTP REQUEST 请求:GET /v2/user/~me HTTP/1.1 Host: https://api.douban.comAuthorization: Bearer a14afef0f66fcffce3e0fcd2e34f6ff4 在命令行中我…

spring authorization server使用说明

spring authorization server使用说明 相关依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><!-- 授权客户端 --><dependency><groupId…

Spring Authorization Server 系列(二)获取授权码

Spring Authorization Server 系列&#xff08;二&#xff09;获取授权码 概述获取授权码获取授权码的url逻辑解析匹配url参数解析 概述 Spring Authorization Server 是基于 OAuth2.1 和 OIDC 1.0 的。 只有 授权码&#xff0c;刷新token&#xff0c;客户端模式。 获取授权码…

Spring Authorization Server 0.2.3变化

目录 引言联邦认证示例public client默认设置Introspection端点自定义访问令牌类型⭐️令牌生成器优化⭐️拆分Client认证逻辑OAuth2ClientAuthenticationProvider⭐️授权端点逻辑⭐️关于0.3.0版本中JwtEncoder相关变化⭐️ 引言 Spring社区在2022-03-24 19:56发布了Spring …

spring authorization server 0.3.1 - 默认示例

spring authorization server 0.3.1 - 默认oidc 开始1、default-authorizationserver项目1.1、AuthorizationServerConfig.java1.2、DefaultSecurityConfig.java1.3、Jwks.java1.4、KeyGeneratorUtils.java1.5、DefaultAuthorizationServer.java1.6、application.yml 2、client…

Authorization Server 认证服务

Hi Auth HiAuth是一个开源的基于Oauth2协议的认证、授权系统&#xff0c;除了标准的Oauth2授权流程功能外&#xff0c;还提供了应用管理、用户管理、权限管理等相关功能。 在这个项目中你能够了解到如何基于spring-security-oauth2-authorization-server实现自己的Authorizat…

java authorization_OkHttp3 之 Authorization处理认证(四)

处理验证 这部分和HTTP AUTH有关. HTTP AUTH 使用HTTP AUTH需要在server端配置http auth信息, 其过程如下:客户端发送http请求 服务器发现配置了http auth, 于是检查request里面有没有”Authorization”的http header 如果有, 则判断Authorization里面的内容是否在用户列表里面…

shiro授权过程

一、授权的核心概念 授权&#xff0c;也就是权限认证或访问控制&#xff0c;即在应用中控制谁能访问哪些资源 授权中的核心要素&#xff1a; 1 用户&#xff0c;在shiro中代表访问系统的任何客户端&#xff0c;即subject 2 角色&#xff0c;是权限的集合&#xff0c;或字符串值…

安全-认证授权、数据脱敏

一、认证授权 JWT &#xff1a;JWT&#xff08;JSON Web Token&#xff09;是一种身份认证的方式&#xff0c;JWT 本质上就一段签名的 JSON 格式的数据。由于它是带有签名的&#xff0c;因此接收者便可以验证它的真实性。 SSO(单点登录) &#xff1a;SSO(Single Sign On) 即单…

认证 (authentication) 和授权 (authorization) 的区别

以前一直傻傻分不清各种网际应用中 authentication 和 authorization, 其实很简单: 这两个术语通常在安全性方面相互结合使用&#xff0c;尤其是在获得对系统的访问权限时。两者都是非常重要的主题&#xff0c;通常与网络相关联&#xff0c;作为其服务基础架构的关键部分。然而…

Authorization—权限控制流程

本篇是对Shiro体系架构的介绍&#xff0c;本栏目大部分内容来自于Shiro官网。翻译过程中已经尽量保证用词的准确性和易懂性&#xff0c;如有不准确或者不确切的地方&#xff0c;请联系作者加以修改。本篇内容翻译自Authorization特征与Authorization官方指南。 Authorization&…

认证 (Authentication) 和授权 (Authorization)的区别是什么?

说简单点就是&#xff1a; 认证 (Authentication)&#xff1a; 你是谁。 授权 (Authorization)&#xff1a; 你有哪些权限 干什么事情。 稍微正式点&#xff08;啰嗦点&#xff09;的说法就是&#xff1a; Authentication&#xff08;认证&#xff09; 是验证您的身份的凭据&a…

变量定义与类型

命名 保留字与关键字 关键字是系统已经用的&#xff0c;保留字是系统自带的的保留 为以后使用做准备 查看关键字方法 import keyword #引入关键字模块 print &#xff08;keyword.kwlist&#xff09; #打印系统全部关键字 变量声明 三种格 #格式1 s1 &#xff02;北京图灵学…

Java变量定义时候的注意事项

常量定义的基本注意事项 在JAVA语言中&#xff0c;主要利用final关键字&#xff0c;&#xff08;在java类中灵活使用Static关键字&#xff09;来定义常量。 当常量被设定后&#xff0c;一般情况下就不允许在进行修改&#xff0c;如可以利用以下形式来定义一个常量:final doubl…

变量的定义和使用

目录 一、变量的定义 二、变量的组成 1.标识 2.类型 3.值 三、变量的多次赋值 一、变量的定义 变量名(name) 赋值运算符() 值(小王) name 小王 二、变量的组成 1.标识 表示对象所存储的物理地址&#xff0c;使用内置函数 id(obj) 来获取。 print(id(name)) 运行…

C语言中变量声明和变量定义的区别

本文转载至CSDN博客JeanCheng 变量声明和变量定义 变量定义&#xff1a;用于为变量分配存储空间&#xff0c;还可为变量指定初始值。程序中&#xff0c;变量有且仅有一个定义。变量声明&#xff1a;用于向程序表明变量的类型和名字。定义也是声明&#xff0c;extern声明不是定义…

C++ 中的变量定义

变量定义就是告诉编译器在何处创建变量的存储&#xff0c;以及如何创建变量的存储。 变量定义指定一个数据类型&#xff0c;并包含了该类型的一个或多个变量的列表&#xff0c;如下所示&#xff1a; type variable_list; 在这里&#xff0c;type 必须是一个有效的 C 数据类型…

十:变量的定义和声明的区别?

1. 变量的声明&#xff1a; 声明是用来告诉编译器变量的名称和类型&#xff0c;而不分配内存。变量的声明有两重含义&#xff1a; 告诉编译器&#xff0c;这个名字已经匹配到一块内存上&#xff0c;下面的代码用到变量或者对象是在别的地方定义的。声明可以出现多次。 告诉编译…

C语言基础教程 之 如何定义变量!

变量定义就是告诉编译器在何处创建变量的存储&#xff0c;以及如何创建变量的存储。变量定义指定一个数据类型&#xff0c;并包含了该类型的一个或多个变量的列表&#xff0c;如下所示&#xff1a; type variable_list; 在这里&#xff0c;type 必须是一个有效的 C 数据类型&…