快速体验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”。

目录
相关文章
|
22天前
|
JSON 安全 Java
什么是JWT?如何使用Spring Boot Security实现它?
什么是JWT?如何使用Spring Boot Security实现它?
81 5
|
21天前
|
XML 安全 Java
|
1月前
|
Java 开发者 微服务
手写模拟Spring Boot自动配置功能
【11月更文挑战第19天】随着微服务架构的兴起,Spring Boot作为一种快速开发框架,因其简化了Spring应用的初始搭建和开发过程,受到了广大开发者的青睐。自动配置作为Spring Boot的核心特性之一,大大减少了手动配置的工作量,提高了开发效率。
53 0
|
2月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
59 4
|
2月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
178 1
|
2月前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
45 0
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,创建并配置 Spring Boot 项目,实现后端 API;然后,使用 Ant Design Pro Vue 创建前端项目,配置动态路由和菜单。通过具体案例,展示了如何快速搭建高效、易维护的项目框架。
116 62
|
21天前
|
XML Java 数据格式
Spring Core核心类库的功能与应用实践分析
【12月更文挑战第1天】大家好,今天我们来聊聊Spring Core这个强大的核心类库。Spring Core作为Spring框架的基础,提供了控制反转(IOC)和依赖注入(DI)等核心功能,以及企业级功能,如JNDI和定时任务等。通过本文,我们将从概述、功能点、背景、业务点、底层原理等多个方面深入剖析Spring Core,并通过多个Java示例展示其应用实践,同时指出对应实践的优缺点。
47 14
|
1月前
|
消息中间件 缓存 Java
手写模拟Spring Boot启动过程功能
【11月更文挑战第19天】Spring Boot自推出以来,因其简化了Spring应用的初始搭建和开发过程,迅速成为Java企业级应用开发的首选框架之一。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,帮助读者深入理解其工作机制。
43 3
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
81 2