快速体验Spring Security的OAuth2功能

简介: Spring Security OAuth是一个专注于OAuth认证的框架,它完整覆盖了客户端、资源服务、认证服务三大模块,并分别在Spring Security 5.0、5.1和5.3三个版本中被集成,原有的独立项目则进入了维护状态。从趋势上来说,Spring Security集成的OAuth将是一个比Spring Social更好的选择。

代码位置:
https://github.com/andyzhaozhao/spring-security-oauth2-sample

我们前面使用Spring Social实现过社交账号登录的功能,这在Spring Security 4.x的版本中是较为普遍的做法,Spring Boot 1.x也为Spring Social提供过简单的自动配置, 但这些在Spring Boot 2.x和Spring Security 5.x的技术栈中就被移除了,因为从Spring Security 5.0版本开始,官方逐渐把原独立项目Spring Security OAuth的功能集成了进来,Spring Social自然也就变得多余了。

Spring Security OAuth是一个专注于OAuth认证的框架,它完整覆盖了客户端、资源服务、认证服务三大模块,并分别在Spring Security 5.0、5.1和5.3三个版本中被集成,原有的独立项目则进入了维护状态。从趋势上来说,Spring Security集成的OAuth将是一个比Spring Social更好的选择。

在Spring Security 5.0的版本中,由于只集成了OAuth的客户端功能,所以也只有三个子模块:

  • spring-security-oauth2-core OAuth2授权框架和OIDC的核心数据结构和接口,被Client、Resource Server和Authorization Server依赖
  • spring-security-oauth2-jose 对JOSE协议组的支持,具体包括:

    • JSON Web Token (JWT)
    • JSON Web Signature (JWS)
    • JSON Web Encryption (JWE)
    • JSON Web Key (JWK)
  • spring-security-oauth2-client 是Spring Security支持OAuth2和OIDC的Client功能实现包。

接下来我们将快速体验一下Spring Security的OAuth功能。考虑到接入成本等问题,推荐使用Github作为OAuth2服务提供商,因为Github在国内可以正常访问,其提供的认证服务也符合标准的OAuth2协议,并且Github账号申请较为方便,这些因素都有利于我们聚焦Spring Security的OAuth2客户端接入流程。

编码实现

1. 新建工程

首先,新建Spring Boot 2.0工程,pom包依赖如下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-oauth2-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-oauth2-jose</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

2. 在Github官网注册OAuth2应用

首先需要在Github官网注册一个新的OAuth2应用,地址是:https://github.com/settings/applications/new ,打开如图1所示:

image

  1. Application Name,必填,可以随意起一个应用名称。
  2. Homepage URL,必填,本地开发环节,设置为http://localhost:8080即可。
  3. Application description,选填,应用的说明,置空即可。
  4. Authorization callback URL,必填,OAuth认证的重定向地址,本地开发环节可设置为http://localhost:8080/login/oauth2/code/github。

确认完成,点击Register appcation按钮即可注册得到clientId和clientSecret。

当用户通过用户代理(浏览器)成功登录Github,并且用户在批准页(Approva Page)授权允许注册的客户端应用访问自己的用户数据后,Github会将授权码(code)通过重定向方式传递给客户端应用。

Spring Security OAuth默认的重定向模版是{baseUrl}/login/oauth2/code/{registrationId},registrationId表示的是ClientRegistration的唯一ID,我们通常会以接入的OAuth服务商的简称来命名,所以此处设置为github。

3. 配置application.yml

前面我们已经在工程的pom文件中引入了相关依赖包,并且在GitHub上也成功注册了一个OAuth2客户端应用,接下来还需要在配置文件application.yml中增加相应配置:

spring:
  security:
    oauth2:
      client:
        registration:    (1)
          github:        (2)
            client-id: github-client-id
            client-secret: github-client-secret

说明:

  1. spring.security.oauth2.client.registration是OAuth2客户端所有属性的基础前缀。
  2. registration下面的github表示的是ClientRegistration的唯一ID。

另外,client-idclient-secret需要替换为我们前面在Github上注册得到的clientId和clientSecret。

4. 新建Controller

@RestController
public class SimpleController {

    @GetMapping("/hello")
    public String hello(Principal principal) {
        return "hello," + principal.getName();
    }

}

参数中的Principal对象由Spring框架自动注入,表示当前登录的用户。

5. 效果演示

  1. 启动我们新建的OAuth2工程。
  2. 浏览器访问 http://localhost:8080/hello 时将首先重定向到默认生成的登录页,点击GitHub按钮则跳转到Github登录页,如图2:

image

当认证成功时将会跳转到确认授权页面,如图3:

image

点击确定按钮,以授权允许OAuth2客户端应用访问Github的用户数据,此时OAuth2客户端应用会调用用户数据接口(the UserInfo Endpoint)创建认证对象,如果一切顺利,浏览器最终将自动重定向到原访问地址:http://localhost:8080/hello ,并打印字符串“hello,xxx”。

目录
相关文章
|
12月前
|
JSON 安全 Java
什么是JWT?如何使用Spring Boot Security实现它?
什么是JWT?如何使用Spring Boot Security实现它?
1967 5
|
2月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
371 2
|
7月前
|
消息中间件 缓存 NoSQL
基于Spring Data Redis与RabbitMQ实现字符串缓存和计数功能(数据同步)
总的来说,借助Spring Data Redis和RabbitMQ,我们可以轻松实现字符串缓存和计数的功能。而关键的部分不过是一些"厨房的套路",一旦你掌握了这些套路,那么你就像厨师一样可以准备出一道道饕餮美食了。通过这种方式促进数据处理效率无疑将大大提高我们的生产力。
240 32
|
12月前
|
XML 安全 Java
|
7月前
|
安全 Java API
Spring Boot 功能模块全解析:构建现代Java应用的技术图谱
Spring Boot不是一个单一的工具,而是一个由众多功能模块组成的生态系统。这些模块可以根据应用需求灵活组合,构建从简单的REST API到复杂的微服务系统,再到现代的AI驱动应用。
|
6月前
|
监控 安全 Java
Java 开发中基于 Spring Boot 3.2 框架集成 MQTT 5.0 协议实现消息推送与订阅功能的技术方案解析
本文介绍基于Spring Boot 3.2集成MQTT 5.0的消息推送与订阅技术方案,涵盖核心技术栈选型(Spring Boot、Eclipse Paho、HiveMQ)、项目搭建与配置、消息发布与订阅服务实现,以及在智能家居控制系统中的应用实例。同时,详细探讨了安全增强(TLS/SSL)、性能优化(异步处理与背压控制)、测试监控及生产环境部署方案,为构建高可用、高性能的消息通信系统提供全面指导。附资源下载链接:[https://pan.quark.cn/s/14fcf913bae6](https://pan.quark.cn/s/14fcf913bae6)。
971 0
|
8月前
|
SQL 前端开发 Java
深入理解 Spring Boot 项目中的分页与排序功能
本文深入讲解了在Spring Boot项目中实现分页与排序功能的完整流程。通过实际案例,从Service层接口设计到Mapper层SQL动态生成,再到Controller层参数传递及前端页面交互,逐一剖析每个环节的核心逻辑与实现细节。重点包括分页计算、排序参数校验、动态SQL处理以及前后端联动,确保数据展示高效且安全。适合希望掌握分页排序实现原理的开发者参考学习。
500 4
|
12月前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
12月前
|
XML Java 数据格式
Spring Core核心类库的功能与应用实践分析
【12月更文挑战第1天】大家好,今天我们来聊聊Spring Core这个强大的核心类库。Spring Core作为Spring框架的基础,提供了控制反转(IOC)和依赖注入(DI)等核心功能,以及企业级功能,如JNDI和定时任务等。通过本文,我们将从概述、功能点、背景、业务点、底层原理等多个方面深入剖析Spring Core,并通过多个Java示例展示其应用实践,同时指出对应实践的优缺点。
171 14