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

news2024/11/16 19:41:29

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: 9000

logging:
  level:
    org.springframework.security: trace

spring:
  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.0
		http
			// 当未经过身份验证时,重定向到登录页面
			.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://www.coloradmin.cn/o/611244.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开源赋能 普惠未来|OpenHarmony诚邀您参与2023开放原子全球开源峰会

OpenHarmony面向万物智联&#xff0c;秉持“生态统一、开放共赢”的理念&#xff0c;围绕“架构解耦、弹性部署”“自由流转、智慧协同”和“极简开发、一致体验”三大架构特征&#xff0c;构建分布式全场景协同的开源操作系统基座与生态系统。面向全场景、全连接、全智能时代&…

项目管理工具最新排名出炉,哪款最适合您?

项目管理工具当下已经成为项目团队的重要榜首&#xff0c;一款合适好用的项目管理工具可以帮助处理很多机械化工作&#xff0c;将管理者更多精力投入到更有价值的工作中&#xff0c;还可以帮助团队组织和计划项目&#xff0c;跟踪进度&#xff0c;处理预算和协作。 该如何挑选帮…

程序员必须掌握的消息中间件-RocketMQ

设计(design) 1 消息存储 消息存储是RocketMQ中最为复杂和最为重要的一部分&#xff0c;本节将分别从RocketMQ的消息存储整体架构、PageCache与Mmap内存映射以及RocketMQ中两种不同的刷盘方式三方面来分别展开叙述。 1.1 消息存储整体架构 消息存储架构图中主要有下面三个跟消息…

在centos7.9上以 All-in-One 模式安装 KubeSphere

文章目录 前言一、什么是 KubeSphere&#xff1f;二、环境准备1.虚拟机准备2.基础环境准备3.安装docker服务4.下载KubeKey安装工具5.开始安装6.安装结束&#xff0c;登陆验证 总结 前言 在centos7.9上以 All-in-One 模式安装 KubeSphere&#xff0c;在虚拟机上安装 一、什么是…

ABeam×Startup丨德硕管理咨询(深圳)创新研究团队拜访「超次元」,探索元宇宙

右一&#xff1a;超次元商务总监 卢佩瑜 左一、中&#xff1a;ABeam-SZ StartUp创新研究团队 ABeam旗下德硕管理咨询&#xff08;深圳&#xff09;有限公司&#xff08;以下简称“ABeam-SZ”&#xff09;创新研究团队一行前往广州&#xff0c;拜访了海南超次元数码科技有限公司…

【Linux】Centos7下给新用户添加sudo权限

直入正题&#xff1a; 我们用adduser创建新用户后&#xff0c;这个新用户是没有使用sudo的权限的。 比如我们创建一个新用户fortest&#xff1a; 这个用户是没有使用sudo的权限的&#xff1a; 我们可以在root下修改&#xff08; /etc/sudoers &#xff09;这个路径下的文件su…

实用工具篇(二):终端连接神器Tabby

1.Tabby概述 一名 Java 后端开发&#xff0c;日常工作中免不了要和 Linux 服务器打交道&#xff0c;因为生产环境基本上都是部署在 Linux 环境下的。以前我使用的终端工具都是FinalShell&#xff0c;但我又发现一款更好更方便的终端工具---Tabby。下面将介绍这款终端工具的安装…

11.动态规划:树形DP问题、树上最大独立集【灵神基础精讲】

文章目录 树形DP问题一、树的直径&#xff08;二叉树>一般树&#xff09;[543. 二叉树的直径](https://leetcode.cn/problems/diameter-of-binary-tree/)[124. 二叉树中的最大路径和](https://leetcode.cn/problems/binary-tree-maximum-path-sum/)&#x1f3b1;(树的直径)[…

机器学习常识 20: 全连接 BP 神经网络

摘要: BP (Backpropagation ) 神经网络是一个万能的函数模拟器. 所有的神经网络, 本质都是特征提取器 – 斯 ⋅ \cdot ⋅沃索地. 1. BP 神经网络的结构 图 1 给出一个四层神经网络. 输入层有 3 个端口, 表示数据有 3 个特征;第一个隐藏层有 5 个节点, 表示从 3 个特征提出了…

hdfs中acl权限管理的简单实用

1、背景 在我们开发的过程中有这么一种场景&#xff0c; /projectA 目录是 hadoopdeploy用户创建的&#xff0c;他对这个目录有wrx权限&#xff0c;同时这个目录属于supergroup&#xff0c;在这个组中的用户也具有这个目录的wrx权限&#xff0c;对于其他人,不可访问这个目录。…

[时间同步]NTPPTPgPTP

为什么时间同步很重要&#xff1f; 出于诸多原因&#xff0c;精确的时间对于网络至关重要&#xff0c;比如&#xff1a; 网络管理&#xff1a;从不同网络设备采集来的日志信息进行分析时&#xff0c;需要以时间作为参照依据。如果不同设备上的系统时间不一致&#xff0c;会因…

Docker 容器互联

-v 宿主机与容器互联 第一步在本机建立共享目录&#xff1a;share 第二步创建容器&#xff0c;将容器opt目录挂载到本机的/opt/share目录上 -v 宿主机目录/文件:容器目录/文件 #将宿主机目录/文件挂载到容器做数据卷 这个时候test1 /opt和本机/opt/share已经可以实现共享 …

如何在 Dev-Cpp 中配置 easyx 图形库?看这就够了,超详细(gif 图例演示)!

笔者的相关学习集文章&#xff0c;欢迎前来学习与交流&#xff1a; C 入门到入土&#xff01;&#xff01;&#xff01;学习合集Linux 从命令到网络再到内核&#xff01;学习合集 言归正传&#xff0c;本期内容&#xff1a;如何在Dev-Cpp中配置easyx图形库&#xff1f;看这就够…

串口屏-迪文10寸T5串口屏数据交互

效果演示 为了便于理解 建议先看上篇博客 点击跳转到上一篇博客 正式开始 1 打开DGUS 2 如图点击文本显示 数据变量 3 填写数据地址 按步骤操作 3-1 先点击框选1处 3-2 再点击框选2处改地址 我改的1000 3-3 设置完直接导出 插入U盘替换DWSET文件夹文件(这一步不理解去看上一…

右值引用和移动语义 ---- c++11

文章目录&#xff1a; 左值&#xff1f;左值引用&#xff1f;右值&#xff1f;右值引用&#xff1f;左值引用与右值引用比较右值引用的使用场景和意义左值引用的使用场景和意义右值引用和移动语义右值引用引用左值完美转发完美转发实际中的使用场景 c 是一种通用编程语言&#…

个人器件库整理

样品本 包含如下&#xff1a; 电容器件&#xff1a; 元件值封装备注钽电容47uF 10V1206钽电容10uF 10V1206电容10uF 10% 10V0603X5R&#xff0c;CL10A106KP8NNNC 元件值封装备注100nF电容50V&#xff0c;10%0603 电阻器件&#xff1a; 元件值封装备注75 Ω \Omega Ω…

2023-06-05 stonedb-在派生表的场景查询为空无法传递默认值-问题分析

摘要: stonedb-在派生表的场景查询为空无法传递默认值-问题分析. 本文对该问题的成因, 相关功能的代码设计, 在下一步设计时如何应对这种问题, 做相关的分析。 https://stoneatom.yuque.com/staff-ft8n1u/lsztbl/rxlhws22n0f1otxn/edit#AqyB 相关ISSUE: https://github.com…

sql server 内存知识

SQL Server对服务器内存的使用策略是用多少内存就占用多少内存&#xff0c;只用在服务器内存不足时&#xff0c;才会释放一点占用的内存&#xff0c;至少释放多少&#xff0c;完全由sql server控制&#xff0c;所以SQL Server 服务器内存往往会占用很高。 SQL Server提供数据库…

华为OD机试真题 Java 实现【一种字符串压缩表示的解压】【2022Q4 100分】,附详细解题思路

一、题目描述 有一种简易压缩算法&#xff1a;针对全部由小写英文字母组成的字符串&#xff0c;将其中连续超过两个相同字母的部分压缩为连续个数加该字母&#xff0c;其他部分保持原样不变。例如&#xff1a;字符串“aaabbccccd”经过压缩成为字符串“3abb4cd”。 请您编写解…

基于深度学习的视频美颜SDK技术创新与应用案例分析

很多人在拍摄视频时会感到自己的皮肤不够好看&#xff0c;因此需要使用美颜功能。同时&#xff0c;视频美颜也是很多短视频App的核心功能之一。为了提供更加高效、准确的视频美颜功能&#xff0c;很多公司开始研发基于深度学习的视频美颜SDK技术。 与传统的图像处理技术相比&a…