¶ Spring Security 集成 Authing OAuth 2.0 快速开始
本文以 Spring 生态中用于提供认证及访问权限控制的 Spring Security 为例,详细介绍 Spring Security 如何接入 Authing OAuth 2.0
Spring Security 是一个提供安全访问控制解决方案的安全框架。它提供了一组可以在 Spring 应用上下文中配置的 Bean,充分利用了 Spring IOC(控制反转)、DI(依赖注入)和 AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,增强了企业系统的安全性,也减轻了编写大量重复代码的负担。
Spring Security 的主要功能主要包括:
- 认证
- 授权
- 攻击防护
¶ 集成介绍
OAuth 2.0 协议定义了如何能让第三方应用以有限的权限访问 HTTP 服务相关规范,可以通过构建资源拥有者与 HTTP 服务间的许可交互机制,让第三方应用代表资源拥有者访问服务,或者通过授予权限给第三方应用,让其代表自己访问服务。
Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架。它是用于保护基于 Spring 的应用程序的实际标准。它致力于为 Java 应用程序提供身份验证和授权。与所有 Spring 项目一样,Spring Security 的真正强大之处在于可以轻松扩展以满足自定义要求。
下面以 Authing 提供的 OAuth 2.0 服务为例,将详细介绍使用 Spring Security 集成 Authing OAuth 2.0 单点登录的方法
- 开发工具:IDEA
- 项目管理工具:Maven
- JDK 版本:1.8
¶ 配置 Authing
¶ 获取 Authing 平台信息
首先要在 Authing 注册一个账号,然后进入控制台,按照引导步骤新建一个用户池。
点击左侧的「应用」 菜单项,在右侧会看到一个默认创建好的应用。
点击「配置」,看到 App ID、App Secret 和 Issuer url,请妥善保存,之后会用到这些信息。
然后需要在回调地址处添加 http://localhost:8080/login/oauth2/code/authing 之后的选项与下图中保持一致。
Spring Security OAuth 默认的回调地址为 /login/oauth2/code/{clientId}
确认开启 OAuth 2.0 服务并进行配置
¶ 项目搭建
¶ 添加依赖
添加 Spring Web,Spring Security,Spring Oauth2 Client 依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>cn.authing</groupId>
<artifactId>java-core</artifactId>
<version>{LATEST_VERSION}</version>
</dependency>
</dependencies>
¶ 授权码模式
¶ 授权码模式工作流程
- 用户访问客户端,客户端通过重定向引导用户至授权服务器
- 授权服务器对资源所有者进行身份验证,认证成功后重定向至客户端并返回授权码
- 客户端通过授权码与授权服务器交换访问访问令牌
- 客户端使用访问令牌访问资源服务器
- 资源服务器验证访问令牌,并返回受保护数据
执行流程图如下
¶ 修改项目配置文件
找到 src/main/resources/application.properties
,填入项目信息:
server.port=8081
spring.security.oauth2.client.registration.authing.client-id={替换为你的App ID如:App Secret5e72d72e3798fb03e1d57b13}
spring.security.oauth2.client.registration.authing.client-name=authing
spring.security.oauth2.client.registration.authing.client-secret={替换为你的App Secret如:931f19ce2161e5560c072f586c706ee6}
spring.security.oauth2.client.registration.authing.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.authing.client-authentication-method=POST
spring.security.oauth2.client.registration.authing.redirect-uri=http://localhost:${server.port}/login/oauth2/code/authing
spring.security.oauth2.client.registration.authing.scope=profile
spring.security.oauth2.client.provider.authing.user-info-authentication-method=form
spring.security.oauth2.client.provider.authing.authorization-uri=https://{替换为你的Issuer,如:authing-net-sdk-demo}.authing.cn/oauth/auth
spring.security.oauth2.client.provider.authing.user-name-attribute=username
spring.security.oauth2.client.provider.authing.token-uri=https://{替换为你的Issuer,如:authing-net-sdk-demo}.authing.cn/oauth/token
spring.security.oauth2.client.provider.authing.user-info-uri=https://core.authing.cn/oauth/me
需要将这里的 {clientId}、{secret}、{authorization-uri} 替换成上一步 应用配置 中的实际信息
¶ 密码模式
¶ 修改项目配置文件
找到 src/main/resources/application.properties
,填入项目信息:
server.port=8081
spring.security.oauth2.client.registration.authing.client-id={替换为你的App ID如:App Secret5e72d72e3798fb03e1d57b13}
spring.security.oauth2.client.registration.authing.client-name=authing
spring.security.oauth2.client.registration.authing.client-secret={替换为你的App Secret如:931f19ce2161e5560c072f586c706ee6}
spring.security.oauth2.client.registration.authing.authorization-grant-type=password
spring.security.oauth2.client.registration.authing.client-authentication-method=POST
spring.security.oauth2.client.registration.authing.scope=profile
spring.security.oauth2.client.provider.authing.token-uri=https://{替换为你的Issuer,如:authing-net-sdk-demo}.authing.cn/oauth/token
需要将这里的 {clientId}、{secret}、{token-uri} 替换成上一步 应用配置 中的实际信息
¶ 业务端处理
密码模式是通过用户名密码直接换取令牌
认证地址 https://{域名}.authing.cn/oauth/token?username={用户名}&password={密码}&grant_type=password&scope={Scope}&client_id={客户端 ID}&client_secret={客户端秘钥}
¶ 客户端模式
¶ 修改项目配置文件
找到 src/main/resources/application.properties
,填入项目信息:
server.port=8081
spring.security.oauth2.client.registration.authing.client-id={替换为你的App ID如:App Secret5e72d72e3798fb03e1d57b13}
spring.security.oauth2.client.registration.authing.client-name=authing
spring.security.oauth2.client.registration.authing.client-secret={替换为你的App Secret如:931f19ce2161e5560c072f586c706ee6}
spring.security.oauth2.client.registration.authing.authorization-grant-type=client_credentials
spring.security.oauth2.client.registration.authing.client-authentication-method=POST
spring.security.oauth2.client.registration.authing.scope=profile
spring.security.oauth2.client.provider.authing.token-uri=https://{替换为你的Issuer,如:authing-net-sdk-demo}.authing.cn/oauth/token
需要将这里的 {clientId}、{secret}、{token-uri} 替换成上一步 应用配置 中的实际信息
¶ 业务端处理
客户端模式与密码模式雷同,通过应用 ID 和应用秘钥换取令牌
认证地址 https://{域名}.authing.cn/oauth/token?grant_type=client_credentials&scope={Scope}&client_id={客户端 ID}&client_secret={客户端秘钥}
¶ 简化模式
¶ 修改项目配置文件
找到 src/main/resources/application.properties
,填入项目信息:
server.port=8080
spring.security.oauth2.client.registration.authing.client-id={替换为你的App ID如:App Secret5e72d72e3798fb03e1d57b13}
spring.security.oauth2.client.registration.authing.client-name=authing
spring.security.oauth2.client.registration.authing.client-secret={替换为你的App Secret如:931f19ce2161e5560c072f586c706ee6}
spring.security.oauth2.client.registration.authing.authorization-grant-type=implicit
spring.security.oauth2.client.registration.authing.client-authentication-method=POST
spring.security.oauth2.client.registration.authing.redirect-uri=http://localhost:${server.port}/callback
spring.security.oauth2.client.registration.authing.scope=profile
spring.security.oauth2.client.provider.authing.token-uri=https://{替换为你的Issuer,如:authing-net-sdk-demo}.authing.cn/oauth/token
需要将这里的 {clientId}、{secret}、{token-uri}、{redirect-uri} 替换成上一步 应用配置 中的实际信息
简化模式下,用户通过浏览器直接发起令牌交换操作,无需后台参与
认证地址 https://{域名}.authing.cn/oauth/authorize?response_type=token&client_id={客户端 ID}&redirect_uri={回调地址}&scope={SCOPE}&state={state}
认证授权之后,浏览器重定向到回调地址并携带访问令牌
¶ 单点登录
¶ 分别创建项目 server-file,server-pic
¶ 修改项目配置文件
server-file
server.port=8081
spring.security.oauth2.client.registration.authing.client-id={替换为你的App ID如:App Secret5e72d72e3798fb03e1d57b13}
spring.security.oauth2.client.registration.authing.client-name=authing
spring.security.oauth2.client.registration.authing.client-secret={替换为你的App Secret如:931f19ce2161e5560c072f586c706ee6}
spring.security.oauth2.client.registration.authing.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.authing.client-authentication-method=POST
spring.security.oauth2.client.registration.authing.redirect-uri=http://localhost:${server.port}/login/oauth2/code/authing
spring.security.oauth2.client.registration.authing.scope=profile
spring.security.oauth2.client.provider.authing.user-info-authentication-method=form
spring.security.oauth2.client.provider.authing.authorization-uri=https://{替换为你的Issuer,如:authing-net-sdk-demo}.authing.cn/oauth/auth
spring.security.oauth2.client.provider.authing.user-name-attribute=username
spring.security.oauth2.client.provider.authing.token-uri=https://{替换为你的Issuer,如:authing-net-sdk-demo}.authing.cn/oauth/token
spring.security.oauth2.client.provider.authing.user-info-uri=https://core.authing.cn/oauth/me
server-pic
server.port=8082
spring.security.oauth2.client.registration.authing.client-id={替换为你的App ID如:App Secret5e72d72e3798fb03e1d57b13}
spring.security.oauth2.client.registration.authing.client-name=authing
spring.security.oauth2.client.registration.authing.client-secret={替换为你的App Secret如:931f19ce2161e5560c072f586c706ee6}
spring.security.oauth2.client.registration.authing.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.authing.client-authentication-method=POST
spring.security.oauth2.client.registration.authing.redirect-uri=http://localhost:${server.port}/login/oauth2/code/authing
spring.security.oauth2.client.registration.authing.scope=profile
spring.security.oauth2.client.provider.authing.user-info-authentication-method=form
spring.security.oauth2.client.provider.authing.authorization-uri=https://{替换为你的Issuer,如:authing-net-sdk-demo}.authing.cn/oauth/auth
spring.security.oauth2.client.provider.authing.user-name-attribute=username
spring.security.oauth2.client.provider.authing.token-uri=https://{替换为你的Issuer,如:authing-net-sdk-demo}.authing.cn/oauth/token
spring.security.oauth2.client.provider.authing.user-info-uri=https://core.authing.cn/oauth/me
¶ 在 Authing 控制台增加回调地址
¶ 设置项目 server-file 受保护资源
¶ 设置项目 server-pic 受保护资源
¶ 验证单点登录效果
¶ 分别启动项目 server-file,server-pic
¶ 访问受保护资源
此时无论访问 server-file 还是 server-pic 都会被重定向到 Authing 认证页面
¶ 登录后访问受保护资源
完成登录后,直接访问 server-pic 的资源也不需要重新进行认证
¶ 基于 Spring Security 进行扩展
¶ 对 Spring Security 进行配置
¶ 增加项目回调地址
¶ 引入 Authing SDK 进行自定义扩展
<dependency>
<groupId>cn.authing</groupId>
<artifactId>java-core</artifactId>
<version>{LATEST_VERSION}</version>
</dependency>
¶ 接下来你可能需要
使用 Spring Security 集成 OIDC
Spring Security 集成 Authing OIDC 快速开始Express 学习
Express 集成 OIDC 单点登录指南使用 Spring Security 集成 CAS
Spring Security 集成 Authing CAS 快速开始