Spring Authorization Server 1.0 提供 Oauth 2.1 和 OpenID Connect 1.0 实现

news2024/9/27 9:18:44

1. 概述

在引入Java 社区两年半之后,VMWare发布了Spring Authorization Server 1.0。Spring 授权服务器项目构建在Spring Security之上,支持创建OpenID Connect 1.0身份提供者和OAuth 2.1授权服务器。该项目取代了不再维护的 Spring Security OAuth项目。

Spring Authorization Server 也是基于Spring Framework 6.0并且需要 Java 17 作为最低版本。该项目支持功能列表中所述的授权授予、令牌格式、客户端身份验证和协议端点。

2. 演示程序

示例应用程序用于演示了使用Spring Initializr创建的 Spring Boot 应用程序的基本配置。示例应用程序是基于 REST 的,并且需要spring-boot-starter-web依赖项pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

为了演示登录功能,请考虑创建 REST 端点的示例:

@RestController
public class TimeController {

    @GetMapping("/time")
    public String retrieveTime() {
        DateTimeFormatter dateTimeFormatter =    
            DateTimeFormatter.ofPattern("HH:mm:ss");
        LocalTime localTime = LocalTime.now();
        return dateTimeFormatter.format(localTime);
    }
}

一个基本的 Spring Boot 应用程序类用于通过先前创建的 REST 端点启动应用程序:

@SpringBootApplication
public class TimeApplication {

    public static void main(String[] args) {
   	 SpringApplication.run(TimeApplication.class, args);
    }
}

启动应用程序并打开 url http://localhost:8080/time 后,显示时间:

21:00:34

现在添加了 Spring Authorization Server 依赖项:

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-oauth2-authorization-server</artifactId>
    <version>1.0.0</version>
</dependency>

再次启动应用程序时,将记录密码,例如:

Using generated security password: d73d5904-25a1-44ed-91e1-a32c4c5aedb8

现在当浏览到http://localhost:8080/time 时,请求被重定向到 http://localhost:8080/login 并显示以下页面:

默认用户名user和登录密码可用于登录,之后请求将重定向到http://localhost:8080/time?continue并再次显示时间。

Developing Your First Application文档详细介绍了 @Bean Spring Authorization Server 所需的几个组件,这些组件应在带有注释的类中定义 @Configuration。第一个 bean 用于定义 OAuth2协议端点:

@Bean
@Order(1)
public SecurityFilterChain protocolFilterChain(HttpSecurity http)
    throws Exception {
    OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http);
    http
        .exceptionHandling((exceptions) -> exceptions
        .authenticationEntryPoint(
            new LoginUrlAuthenticationEntryPoint("/login"))
        )
        .oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt)
        .getConfigurer(OAuth2AuthorizationServerConfigurer.class)
        .oidc(Customizer.withDefaults());

        return http.build();
}

第二个 bean 用于定义 Spring Security Authentication:

@Bean
@Order(2)
public SecurityFilterChain authenticationFilterChain(HttpSecurity http) throws Exception {
    http
    .authorizeHttpRequests((authorize) -> authorize
        .anyRequest().authenticated()
    )
    .formLogin(Customizer.withDefaults());

    return http.build();
}

存储用户的正确解决方案应该用于实际产品,但是这个简化的示例将用户james和密码gosling存储在内存中:

@Bean
public UserDetailsService userDetailsService() {
    UserDetails userDetails = User.withDefaultPasswordEncoder()
        .username("james")
        .password("gosling")
        .roles("FOUNDER")
        .build();

    return new InMemoryUserDetailsManager(userDetails);
}

新客户在内存中注册RegisteredClientRepository

@Bean
public RegisteredClientRepository registeredClientRepository() {
    RegisteredClient registeredClient =            
        RegisteredClient.withId(UUID.randomUUID().toString())
        .clientId("id")
        .clientSecret("secret")
        .clientAuthenticationMethod(
            ClientAuthenticationMethod.CLIENT_SECRET_BASIC)
        .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
        .authorizationGrantType(AuthorizationGrantType.REFRESH_TOKEN)
        .authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS)
        .redirectUri(
          "http://127.0.0.1:8080/login/oauth2/code/messaging-client-oidc")
        .redirectUri("http://127.0.0.1:8080/authorized")
        .scope(OidcScopes.OPENID)
        .scope(OidcScopes.PROFILE)
        .scope("message.read")
        .scope("message.write")
        .clientSettings(
            ClientSettings.builder()
            .requireAuthorizationConsent(true).build())
        .build();

	return new InMemoryRegisteredClientRepository(registeredClient);
}

访问令牌在以下 bean 的帮助下使用**com.nimbusds.jose.jwk.RSAKeyand not进行签名java.security.interfaces.RSAKey**:

@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;
}

JwtDecoder 用来解码签名的access tokens ,这里使用的是com.nimbusds.jose.proc.SecurityContext 而不是org.springframework.security.core.context.SecurityContext

@Bean
public JwtDecoder jwtDecoder(JWKSource<SecurityContext> jwkSource) {
    return OAuth2AuthorizationServerConfiguration.jwtDecoder(jwkSource);
}

最后,AuthorizationServerSettings用于配置 OAuth2 授权服务器:

@Bean
public AuthorizationServerSettings authorizationServerSettings() {
    return AuthorizationServerSettings.builder().build();
}

现在浏览 http://localhost:8080/time 时 ,可以使用密码为gosling的用户james来查看当前时间。 执行这些步骤后,可以扩展应用程序以使用各种 OAuth2 和 OpenID Connect 1.0 功能。

3.更多

其他参考资料可以查看入门指南。

原文地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/129693.html

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

相关文章

RHCEansible虚拟机初始化配置,ansible配置和安装

1.保证三台主机能互相通信&#xff0c;需要设置同一种网络模式&#xff08;nat&#xff09; 2.配置静态ip地址&#xff08;命令行&#xff0c;图形界面都可以&#xff09; server---192.168.171.100 node1---192.168.171.222 node2---192.168.171.10 3.更改主机名 永久更…

C++代码编程学习(1):简易通讯录的创建

2022年圣诞节到来啦&#xff0c;很高兴这次我们又能一起度过~ CSDN诚邀各位技术er分享关于圣诞节的各种技术创意&#xff0c;展现你与众不同的精彩&#xff01;参与本次投稿即可获得【话题达人】勋章【圣诞快乐】定制勋章&#xff08;1年1次&#xff0c;错过要等下一年喔&#…

消费市场的“跨年”:2023,数字新消费将引领市场何去何从?

配图来自Canva可画 2022&#xff0c;变局如同一个过滤器&#xff0c;每一个身处其中的消费者和消费品牌都在经受考验。我国人口红利在消退&#xff0c;竞争在加剧&#xff0c;需求在变化。光大证券研究所的数据显示&#xff0c;2022年来我国居民收入增速小幅改善&#xff0c;但…

Spring之Bean创建过程

1. 前言 Spring提供了xml、注解、JavaConfig多种方式来配置bean&#xff0c;不论何种方式&#xff0c;Spring最终都会将bean封装成BeanDefinition对象&#xff0c;Spring创建bean的依据也是通过BeanDefinition来完成的。 当我们调用getBean()方法获取bean实例时&#xff0c;不…

jmeter使用教程之登录接口(工作日记)

首先我们打开jmeter 快捷按钮&#xff1a;winr 会弹出快捷运行弹框&#xff0c;我们输入cmd 后点击回车 会弹出一个控制窗口&#xff0c;我们输入jmeter&#xff0c;然后回车 首次进入jmeter&#xff0c;页面显示空白页且默认英文 我们可以切换语言 【Options - Choose Lan…

AI前沿 | 利用训练好的模型库进行一键抠图(实例演示)

来源&#xff1a;投稿 作者&#xff1a;Struggling cyanobacteria 编辑&#xff1a;学姐 深度学习平台飞浆paddle的环境搭建 ① 效率更高的 gpu 版本的安装 通过 python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple来进行安装。 paddle.utils…

Dockerfile了解

目录 1.自定义centos&#xff0c;具备vim及ifconfig作用 2.自定义tomcat8 1.自定义centos&#xff0c;具备vim及ifconfig作用 cd /javaxl/software mkdir mydocker vi mycentosDockerfile 向 mycentosDockerfile 编辑内容 FROM centos:7 MAINTAINER zwc "zwcqq.com"…

解决Windows下使用cmd执行Python文件报错 ModuleNotFoundError: No module named ‘XXXX‘

一、问题产生 我在IDEA中可以正常执行的Python文件&#xff0c;想把它配置成每天固定时间执行的定时任务。我写了一个脚本在每天9点时执行Python文件&#xff0c;但是我在cmd中测试执行时遇到以下报错&#xff1a; Traceback (most recent call last):File "D:\dev\code…

AD5328手册翻译不完全(仅供参考)

最近要用到DAC生成数据波形&#xff0c;但是都是英文不好阅读&#xff0c;于是花费点时间翻译了大致数据内容并记录 一、特性 AD5308:16导联TSSOP中的8个缓冲8位DAC A版本&#xff1a;1 LSB INL&#xff0c;B版本&#xff1a;0.75 LSB INR AD5318:16导联TSSOP中的8个缓冲10…

互联网时代,VR全景营销的意义是什么?

互联网时代&#xff0c;很多事项我们都可以在手机上解决&#xff0c;随着互联网的不断发展&#xff0c;年轻人每天花在手机上的时间也在日益增加&#xff0c;这就将压力给到了线下实体店铺&#xff0c;年轻人不喜欢逛街&#xff0c;线下店铺的获客成本就会越来越高。同时也是由…

无人机测深三种方法-激光雷达,测深仪和探地雷达

最近搜素了论文和相关网页&#xff0c;博主总结了一下无人机测深总共有三种办法&#xff1a; &#xff08;1&#xff09;激光雷达&#xff1b; &#xff08;2&#xff09;测深仪&#xff1b; &#xff08;3&#xff09;探地雷达&#xff08;GPR&#xff09;。 1、激光雷达 …

如何在匿名上位机中显示自定义数据波形

匿名上位机相信很多人都用过&#xff0c;以前在调飞控的时候使用过&#xff0c;可以很直观的显示数据的波形&#xff0c;比如飞机姿态等。 最近在调试foc。很多数据在调试过程中&#xff0c;仅仅使用串口打印出来显示是很不直观的&#xff0c;比如正弦波&#xff0c;经典的马鞍…

Python冷知识-优雅的文档属性

Python是一门学习成本低但是使用场景广泛的语言&#xff0c;0基础2周左右就可以进行简单的脚本编写&#xff0c;但也正是因为这个原因&#xff0c;导致很多小伙伴的Python代码比较粗糙&#xff0c;那么我们来聊聊使用文档属性让Python代码更加的优雅。 设置文档属性 作为一名…

JUC并发编程学习笔记(二)Lock接口及线程间通信

2 Lock 接口 2.1 Synchronized 2.1.1 Synchronized 关键字回顾 synchronized 是 Java 中的关键字&#xff0c;是一种同步锁。它修饰的对象有以下几种&#xff1a; 修饰一个代码块&#xff0c;被修饰的代码块称为同步语句块&#xff0c;其作用的范围是大括号{}括起来的代码&…

软件测试中白盒测试的优缺点是什么?

白盒测试的优缺点白盒测试在计算机领域行业用以检查程序的状态&#xff0c;确定实际运行状态与预期状态是否一致&#xff0c;来看看白盒测试的优点和缺点是什么吧。 白盒测试的测试方法有代码检查法、静态结构分析法、静态质量度量法、逻辑覆盖法、基本路径测试法、域测试、符…

Android学习进阶——Dagger 2 使用及原理

概述 Dagger 2 是 Google 开源的一款依赖注入框架&#xff0c;它的前身是 square 的 Dagger 1&#xff0c;Dagger 2 在 Android 中有着较为广泛的应用。 Dagger 2 基于 Java 注解&#xff0c;采用 annotationProcessor&#xff08;注解处理器&#xff09; 在项目编译时动态生…

AS-REPRoasting

讲在前面&#xff1a; 最近笔者发布的几篇文章&#xff0c;大家不难发现&#xff0c;都是和kerberos协议相关的。国内外各类的研究员对于该协议的研究愈发的深入&#xff0c;从该协议产生的漏洞就会越来越多甚至越来越严重。当然这只是笔者的一点拙见。 在介绍了Kerberoastin…

21天Java开发速成篇-Java从入门到大师01快速入门

Java 简介 win10安装 JDK 下载和安装 访问 oracle 官网https://www.oracle.com/ 建议下载解压版,下载完毕后&#xff0c;解压到一个没有中文和空格的目录即可 配置 Path 你可以选择一个喜欢的目录&#xff0c;我的解压目录是 d 盘根目录下&#xff0c;如图所示 其中 b…

创邻Galaxybase入选 2022 爱分析《中国数据智能最佳实践案例》

随着2022年进入收官时间&#xff0c;创邻科技喜报频传。近日&#xff0c;“2022爱分析中国数据智能最佳实践案例”评选结果出炉&#xff0c;经过申报、初评、调研、终评等多轮角逐&#xff0c;创邻科技凭借“中国民生银行万象知识图谱应用平台”成功获评2022中国数据智能最佳实…

FPGA知识汇集-FPGA时序基础理论

对于系统设计工程师来说&#xff0c;时序问题在设计中是至关重要的&#xff0c;尤其是随着时钟频率的提高&#xff0c;留给数据传输的有效读写窗口越来越小&#xff0c;要想在很短的时间限制里&#xff0c;让数据信号从驱动端完整地传送到接收端&#xff0c;就必须进行精确的时…