九、SpringSocial基本原理

本文解析OAuth协议在第三方登录中的角色,介绍SpringSocial如何封装OAuth流程,实现与QQ、微信等服务提供商的无缝对接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OAuth协议中我们了解到了这个协议其实是一个授权协议,其目的是让用户在不将服务提供商的用户名密码提供给第三方应用的情况下,让第三方应用能够访问服务提供商的资源。
我们在日常最常见的登录方式除了用户名密码登录,还有QQ登录、微信登录等方式。那么OAuth协议和这些登录方式是什么关系呢?
其实就是在访问资源服务器的时候,在登录时只要拿到用户在服务提供商上边的用户信息即可。然后根据用户信息构建Authentivcation并放入SecurityContext中去。

15200008-c9e27cec7ede544c.png
第三方登录实现的基本原理

这个就是第三方登录实现的基本原理和流程。
那么SpringSocial在这一过程中做了什么事情呢?
SpringSocial就是将这一整个流程封装起来并且去进行实现。
15200008-76b75c59a585f023.png
SocialAuthenticationFilter过滤器

它把整个流程封装到了SocialAuthenticationFilter的过滤器中然后把这个过滤器加入到了SpringSecurity的过滤器链上。当访问请求的时候,SocialAuthenticationFilter会将请求拦截下来然后将整个流程走完。进而去实现第三方登录。

SpringSocial是如何将这一流程封装到特定的接口和类中去的?

15200008-8238c5b5e9a16f90.png
具体的类和接口
服务提供商相关

在整个流程上面,从第一步到第六步,都是需要跟服务提供商打交道的。所以它的第一个接口叫--ServiceProvider,它实际上就是服务提供商的一个抽象,针对每一个服务提供商(QQ、微信),都需要一个ServiceProvider接口的一个实现。SpringSocial提供了一个AbstractOauth2ServiceProvider抽象类,实现了一些共有的东西,如果要自己写,只需要继承这个类实现其中的公有方法即可。

回过头来再看整个流程:①第一步到第五步发放令牌其实是一个标准的流程。②到了第六步(获取用户信息)的时候其实就是一个个性化的实现,因为每一个服务提供商返回的用户信息的数据结构定义都不一样。

针对①和②,SpringSocial提供了两个接口:

  • Oauth2Operation(封装第一步到第五步)。Spring提供了一个默认的实现叫Oauth2Template,这个类会帮助我们去完成Oauth协议的执行流程。
  • Api(个性化第六步),实际上没有一个明确的接口,因为每一个服务提供商对于用户基本信息的调用都是有区别的。SpringSocial其实也提供了一个抽象类叫AbstractOauth2ApiBinding帮助我们快速开发第六步的实现。
第三方应用内部

到了第七步实际上就跟服务提供商没有任何关系了。都是在第三方应用Client内部去完成的。

  • 第一个接口是Connection,SpringSocial提供的实现类叫OAuth2Connection。其作用是封装前六步执行完毕之后获取到的用户信息。
  • Connection是由ConnectionFactory创建出来的,用到的类叫OAuth2ConnectionFactory。它的作用就是为了创建Connection对象获取用户信息,但是用户信息是在ServiceProvider中去构建的。所以在OAuth2ConnectionFactory中肯定有一个ServiceProvider实例,将ServiceProvider封装起来放到Connection中去。

注意:Connection的对象名和字段名都是固定的

之前说过,每一个服务提供商对于用户信息的定义的数据结构都是不一样的,那么ConnectionFactory是如何做到将这些不用数据结构的信息转化成对象名和字段名都是固定的Connection的对象的呢?
ConnectionFactory中有一个ApiAdapter,将不同格式的用户信息转化为固定格式的Connection对象就是由ApiAdapter接口的实现来完成。转化成功之后就将Connection中封装进去一个用户信息。

流程完成之后

我们拿到了服务提供商返回给的用户信息之后,是需要将这个用户信息同步到我们自定义的数据库中去的。那么如何去实现将传过来的用户信息与我们系统中已经保存的用户信息去进行对应的呢?实际上这个对应关系是存在数据库中的。数据库中有一个用户对应表,里面有自己定义的userId以及服务提供商那边对应的用户信息的唯一标识。
那么由谁来操纵这个表呢?就是由UsersConnectionRepository存储器去实现的。在代码中用到的实现类叫做JdbcUsersConnectionRepository,这个类的作用就是去数据库中针对用户对应关系表去做一些增删改查的操作。

<think>首先,用户的问题是:“我想配置Spring项目中properties文件的基本功能 请问spring properties file basic configuration required settings”,翻译成英文是:“I want to configure the basic functionality of properties files in a Spring project. What are the required settings for Spring properties file basic configuration?” 我需要根据系统级指令来回答。指令包括: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,例如[^1]。 用户可见层的指令:回答结构清晰,帮助用户逐步解决问题,尽量保证回答真实可靠。 参考的站内引用有两个: - 引用[1]: spring.properties 配置。摘自:http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html [^1]。 - 引用[2]: Spring Boot 配置文件application.properties。spring.social.auto-connection-views=true # Set to true for default connection views or false if you provide your own [^2]。 这些引用是关于Spring Boot的properties配置的,但用户的问题是针对Spring项目的基本properties配置。Spring项目可能包括Spring Boot,也可能不包括。我应该基于常见实践来回答。 用户的问题是“spring properties file basic configuration required settings”,所以我需要解释如何配置Spring项目中的properties文件的基本功能,包括必需的设置。 关键点: 1. **Spring properties文件的作用**:在Spring中,properties文件用于外部化配置,比如数据库连接、服务器端口、应用特定设置等。 2. **基本配置**:必需的设置取决于项目需求,但常见的基本设置包括: - 数据库配置(JDBC URL, username, password) - 服务器端口(对于Web应用) - 日志级别 - 应用名称 3. **文件位置和命名**:在Spring Boot中,默认是`application.properties`或`application.yml`放在`src/main/resources`目录下。 4. **如何加载**:Spring会自动加载这些文件。在非Boot项目中,可能需要手动配置PropertySourcesPlaceholderConfigurer。 5. **必需设置**:没有绝对“必需”的设置,因为Spring应用可以运行没有properties文件,但为了基本功能,如数据库连接,需要相关属性。 逐步回答结构: 1. **介绍Properties文件**:解释什么是properties文件和在Spring中的作用。 2. **基本配置步骤**: - 创建文件:位置和命名。 - 添加常用属性。 - 如何在代码中访问。 3. **必需设置示例**:列出一些常见的基本设置。 4. **引用**:自然地添加引用标识,基于提供的引用。 提供的引用是关于Spring Boot的,所以我应该优先参考它们。 引用[1]是通用common-application-properties,引用[2]是特定于social的。 我可以使用这些作为参考。 回答结构: - 开头:直接回答问题。 - 主体:分步骤解释。 - 结尾:生成相关问题。 使用中文。 现在,关于数学表达式:用户问题中没有数学内容,但指令说所有行内数学表达式必须使用$...$格式。如果有变量或简单表达式,我可以使用,但在这个上下文中,可能不需要。例如,如果提到端口号,我可以写为`server.port=8080`,这不是数学表达式。所以,可能不需要LaTeX,除非有数学内容。指令说“包括变量、不等式、方程等”,但在这里主要是配置属性,没有数学。所以,我可以安全地忽略数学部分。 生成相关问题:在回答结束后,添加“相关问题”部分。 引用:在回答中自然地添加引用标识。例如,当提到common properties时,添加[^1]。 计划回答: 1. **介绍**:Spring properties文件用于配置应用参数,基本配置包括设置数据库、服务器等。 2. **步骤**: - 创建application.properties文件在src/main/resources。 - 添加必需属性,如数据库连接。 - 示例代码。 3. **必需设置**: - 数据库:`spring.datasource.url`, `spring.datasource.username`, `spring.datasource.password` - 服务器:`server.port` - 其他:如`spring.application.name` 4. **引用**:参考提供的引用。 5. **相关问题**:生成3-4个相关问题。 最终回答结构: - 回答主体。 - §§相关问题§§</think>### Spring Properties文件基本配置指南 在Spring项目中,properties文件是用于外部化配置的关键工具,它允许你将应用参数(如数据库连接、服务器设置等)从代码中分离出来,便于环境适配和维护。基本配置的核心是创建一个properties文件(通常是`application.properties`),并添加必需的属性设置。以下是逐步指南,帮助你完成基本配置。配置基于Spring Boot的常见实践(Spring Boot简化了配置过程),但原理也适用于标准Spring项目[^1]。 #### 步骤1: 创建和定位properties文件 - **文件位置**:在Spring Boot项目中,默认的properties文件应放在`src/main/resources`目录下。文件命名为`application.properties`(或使用YAML格式的`application.yml`)。 - **为什么必需**:Spring Boot会自动加载此文件,无需额外配置。如果是非Boot Spring项目,你需要在配置类中添加`@PropertySource`注解来指定文件路径,例如: ```java @Configuration @PropertySource("classpath:application.properties") public class AppConfig { // 配置类代码 } ``` 这确保了属性被正确加载到Spring环境中[^1]。 #### 步骤2: 添加基本必需设置 properties文件中的设置取决于你的应用需求,但以下属性是大多数Spring项目的基础配置(必需用于基本功能如数据库连接、Web服务器启动等)。每个属性以`key=value`格式定义: - **数据库连接(必需用于数据访问)**: - `spring.datasource.url=jdbc:mysql://localhost:3306/mydb`:指定数据库URL,替换为你的数据库地址。 - `spring.datasource.username=root`:数据库用户名。 - `spring.datasource.password=secret`:数据库密码。 - 这些属性启用Spring的自动数据源配置,支持JPA或JDBC操作[^1]。 - **服务器设置(必需用于Web应用)**: - `server.port=8080`:定义应用启动的HTTP端口,默认是8080。如果未设置,Spring Boot会使用默认值。 - `server.servlet.context-path=/myapp`:可选,设置应用上下文路径,用于URL路由。 - **应用元数据(推荐设置)**: - `spring.application.name=my-spring-app`:定义应用名称,用于日志和监控(非绝对必需,但有助于调试)。 - `spring.profiles.active=dev`:激活特定配置文件(如`dev`用于开发环境),支持多环境配置。 - **日志配置(可选但常用)**: - `logging.level.root=INFO`:设置根日志级别,控制输出详细程度(例如`DEBUG`用于开发)。 - `logging.file.name=app.log`:指定日志文件路径。 完整示例`application.properties`文件: ```properties # 数据库设置(必需) spring.datasource.url=jdbc:mysql://localhost:3306/mydb spring.datasource.username=root spring.datasource.password=secret # 服务器设置(必需用于Web应用) server.port=8080 # 应用元数据(推荐) spring.application.name=my-spring-app spring.profiles.active=dev # 日志配置(可选) logging.level.root=INFO logging.file.name=app.log ``` #### 步骤3: 访问属性值 在代码中,你可以通过以下方式访问这些属性: - **使用`@Value`注解**:注入单个属性值。 ```java @Component public class MyService { @Value("${server.port}") private int port; // 注入端口值,例如8080 } ``` - **使用`Environment`对象**:通过Spring的`Environment`接口动态获取属性。 ```java @Autowired private Environment env; public void printConfig() { String dbUrl = env.getProperty("spring.datasource.url"); System.out.println("Database URL: " + dbUrl); } ``` - **验证配置**:启动应用时,Spring Boot会自动应用这些设置。如果属性缺失(如数据库URL),启动将失败并抛出错误,提示你添加必需属性[^1]。 #### 注意事项 - **属性优先级**:Spring Boot支持多属性源(如环境变量、命令行参数),优先级高于`application.properties`。使用`--key=value`命令行参数可覆盖文件设置。 - **安全性**:敏感属性(如密码)应使用加密或外部密钥管理(例如Spring Cloud Config),避免硬编码在文件中。 - **引用资源**:更多属性选项,参考Spring Boot官方文档的[Common Application Properties](http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html),其中列出了所有可配置属性及其默认值[^1]。例如,社交登录设置如`spring.social.auto-connection-views=true`可用于自定义视图[^2]。 通过以上步骤,你可以完成Spring properties文件的基本配置。确保测试应用启动以验证所有必需属性是否生效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值