GenAuth DocsDocuments
Concepts
User Guide
Development Integration
AgentAuth
Metadata
Development Integration
Multi-tenant (beta)
Console Documentation
Multi-tenant Console
Tenant Console
Saas Application Demo
Concepts
User Guide
Development Integration
AgentAuth
Metadata
Development Integration
Multi-tenant (beta)
Console Documentation
Multi-tenant Console
Tenant Console
Saas Application Demo
Old version
  • Single Page Web Application

  • Mobile and Client Applications

  • Standard Web Application

  • Framework Integration

    • Spring CAS
    • Spring OAuth
    • Spring OIDC
    • Express OIDC
    • Express Passport
  • Others

  1. Development Integration
  2. /
  3. Framework Integration
  4. /
  5. Spring OAuth

¶ Spring Security 集成 GenAuth OAuth 2.0 快速开始

本文以 Spring 生态中用于提供认证及访问权限控制的 Spring Security 为例,详细介绍 Spring Security 如何接入 GenAuth 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 的真正强大之处在于可以轻松扩展以满足自定义要求。

下面以 GenAuth 提供的 OAuth 2.0 服务为例,将详细介绍使用 Spring Security 集成 GenAuth OAuth 2.0 单点登录的方法

  • 开发工具:IDEA
  • 项目管理工具:Maven
  • JDK 版本:1.8

¶ 配置 GenAuth

¶ 获取 GenAuth 平台信息

首先要在 GenAuth 注册一个账号,然后进入控制台,按照引导步骤新建一个用户池。

点击左侧的「应用」 菜单项,在右侧会看到一个默认创建好的应用。 创建应用

点击「配置」,看到 App ID、App Secret 和 Issuer url,请妥善保存,之后会用到这些信息。 查看应用信息

然后需要在回调地址处添加 http://localhost:8080/login/oauth2/code/authing 之后的选项与下图中保持一致。

Spring Security OAuth 默认的回调地址为 /login/oauth2/code/{clientId}

默认回调地址

确认开启 OAuth 2.0 服务并进行配置 开启OAuth

¶ 项目搭建

¶ 添加依赖

添加 Spring Web,Spring Security,Spring Oauth2 Client 依赖 创建项目2

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

¶ 授权码模式

¶ 授权码模式工作流程

  1. 用户访问客户端,客户端通过重定向引导用户至授权服务器
  2. 授权服务器对资源所有者进行身份验证,认证成功后重定向至客户端并返回授权码
  3. 客户端通过授权码与授权服务器交换访问访问令牌
  4. 客户端使用访问令牌访问资源服务器
  5. 资源服务器验证访问令牌,并返回受保护数据

    执行流程图如下 执行流程图

¶ 修改项目配置文件

找到 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}.genauth.ai/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}.genauth.ai/oauth/token
spring.security.oauth2.client.provider.authing.user-info-uri=https://core.genauth.ai/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}.genauth.ai/oauth/token

需要将这里的 {clientId}、{secret}、{token-uri} 替换成上一步 应用配置 中的实际信息

¶ 业务端处理

密码模式

密码模式是通过用户名密码直接换取令牌

认证地址 https://{域名}.genauth.ai/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}.genauth.ai/oauth/token

需要将这里的 {clientId}、{secret}、{token-uri} 替换成上一步 应用配置 中的实际信息

¶ 业务端处理

密码模式

客户端模式与密码模式雷同,通过应用 ID 和应用秘钥换取令牌

认证地址 https://{域名}.genauth.ai/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}.genauth.ai/oauth/token

需要将这里的 {clientId}、{secret}、{token-uri}、{redirect-uri} 替换成上一步 应用配置 中的实际信息

简化模式

简化模式下,用户通过浏览器直接发起令牌交换操作,无需后台参与

认证地址 https://{域名}.genauth.ai/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}.genauth.ai/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}.genauth.ai/oauth/token
spring.security.oauth2.client.provider.authing.user-info-uri=https://core.genauth.ai/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}.genauth.ai/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}.genauth.ai/oauth/token
spring.security.oauth2.client.provider.authing.user-info-uri=https://core.genauth.ai/oauth/me

¶ 在 GenAuth 控制台增加回调地址

sso 回调地址

¶ 设置项目 server-file 受保护资源

项目a资源

¶ 设置项目 server-pic 受保护资源

项目b资源

¶ 验证单点登录效果

¶ 分别启动项目 server-file,server-pic

启动项目a 启动项目b

¶ 访问受保护资源

此时无论访问 server-file 还是 server-pic 都会被重定向到 GenAuth 认证页面

重定向登录

¶ 登录后访问受保护资源

完成登录后,直接访问 server-pic 的资源也不需要重新进行认证

登录成功

¶ 基于 Spring Security 进行扩展

¶ 对 Spring Security 进行配置

自定义spring

¶ 增加项目回调地址

自定义回调地址

¶ 引入 GenAuth SDK 进行自定义扩展

 <dependency>
    <groupId>cn.authing</groupId>
    <artifactId>java-core</artifactId>
    <version>{LATEST_VERSION}</version>
</dependency>
自定义扩展点

¶ 接下来你可能需要

使用 Spring Security 集成 OIDC

Resources on this page

Express 学习

Express Integration OIDC Single Sign-On Guide

使用 Spring Security 集成 CAS

Resources on this page
本页资源 下载一个 Spring Security 集成 GenAuth OAuth 2.0 快速开始的示例程序或在 GitHub 查看。
下载 在 GitHub 查看
Previous article: Spring CAS Next article: Spring OIDC
  • 集成介绍
  • 配置 GenAuth
  • 项目搭建
  • 单点登录
  • 基于 Spring Security 进行扩展
  • 接下来你可能需要

User identity management

Integrated third-party login
Customized authentication process

Enterprise internal management

Single sign-on
Multi-factor authentication
Permission management

Developer

Development Documentation
GitHub (opens new window)

Company

official@genauth.ai
16th Floor, Building B, Beichen Century Center, Chaoyang District, Beijing (Total)
Room 406, 4th Floor, Block B, No. 200, Tianfu Fifth Street, High-tech Zone, Chengdu (Branch)

© Beijing Steamory Technology Co., Ltd.