前言
springboot
整合springsecurity oauth2
进行第三方登录,例如qq、微信、微博。网上一堆教程,并且很多都是旧版本的,篇幅又长,哔哩吧啦一大堆,就算你搞下来了,等下次版本升级或变更一下,你又不知道怎么改了。这篇文章主要是分享一下我自己是如何实现第三方登录的,其实很简单~~~
1.引入依赖
新建一个springboot
工程(过程省略),引入springseurity
的相关依赖
xml
<properties>
<java.version>17</java.version>
<spring-security.version>5.7.9</spring-security.version>
</properties>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
如果你想快速开始项目直接复制依赖即可,这一节下面的解释可以不用看。下面主要是教你如何阅读文档
这里spring-security版本是5.7.9,我这里之所有设置版本号,主要是为了查看对应的文档。
有人可能会说,你怎么知道要引入这两个依赖?
这是我的一个总结,如果说想使用第三方的工具,首先要看它的官方文档,主要看什么呢?
- 它的简介,有助于了解工具的实现的功能
- 快速开始,任何一个工具使用起来都很简单,只是随着你的需求越多,其配置就越复杂罢了
- 提供的demo
有人说文档都是英文的看不懂,怎么办?
看不懂就去翻译
翻译了之后又看不懂呢?
那就去百度,结合百度上的一些文章,它可以让你更快的掌握这个工具。
话说回来,怎么知道引入这些依赖。说真的,springsecurity
的文档并不友好,首先我去了 "OAuth2"这个菜单下找,发现并没有,然后就到它提供的demo上找
因为项目是使用gradle构建的,所以看build.gradle这个文件就可以找到相关的依赖,我们发现有这样的一段代码
gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'
integTestImplementation 'net.sourceforge.htmlunit:htmlunit'
}
其实只需引入"spring-boot-starter-oauth2-client"这个依赖即可,但如果你想实现账号密码登录,那就得引入"spring-boot-starter-security",一般情况下最好都引入一下。
2.引入配置
这是一个github的配置,因为springsecurity
集成了github和 google 登录,因此配置可以少配置一些
yaml
server:
port: 8877
spring:
security:
oauth2:
client:
registration:
github:
client-id: 你的id
client-secret: 你的secret
但是如果你是其它第三方登录,比如微博、微信,那你需要以下完整配置,依然以github为例
yaml
server:
port: 8877
spring:
security:
oauth2:
client:
registration:
github:
client-id: 你的id
client-secret: 你的secret
redirect-uri: http://localhost:8877/login/oauth2/code/github
scope: repo,user
provider:
github:
authorization-uri: https://github.com/login/oauth/authorize
token-uri: https://github.com/login/oauth/access_token
user-info-uri: https://api.github.com/user
user-name-attribute: login
github的client-id和client-secret可以自行申请,只要注册一个git账号,然后登录账号申请即可,很简单,如果实在不知道,可以留言~~
如果你想快速开始项目,直接加上这个配置即可,后面的内容是关于这份配置的介绍
https://docs.spring.io/spring-security/reference/5.7/servlet/oauth2/login/core.html
上面这些配置,在你申请第三方密钥后都可以找得到,下面就简单说一下几个点
- registration:github和provider:github要对应,不能是provider:github1
- redirect-uri回调地址格式固定,localhost:8877表示你的域名,github要与registration:github中的github对应
- user-name-attribute,就是说返回的用户信息,那个字段是用户名字段
user-name-attribute: login 的作用是告诉 Spring Security OAuth2 将 OAuth2 提供商返回的用户信息中的 login 属性视为用户的用户名。
如果不设置 user-name-attribute,Spring Security OAuth2 将默认使用 OAuth2 提供商返回的用户信息中的 sub 属性作为用户的用户名。
在 GitHub 的用户信息响应中,sub 属性是用户的唯一标识符,而 login 属性是用户的用户名。因此,如果将 user-name-attribute 设置为 login,Spring Security OAuth2 将使用 login 属性的值作为用户的用户名。
如果不设置 user-name-attribute,Spring Security OAuth2 将使用默认的 sub 属性作为用户的用户名。这可能适用于大多数 OAuth2 提供商,因为它们通常会返回一个唯一的用户标识符。
根据您的应用程序的需求和使用的 OAuth2 提供商,您可以选择设置适当的 user-name-attribute 值,以确保在用户认证和授权过程中使用正确的用户名。
如果不设置 user-name-attribute 并且默认的 sub 属性在返回的用户信息中不存在,可能会导致用户认证和授权过程中的问题。因此,正确配置 user-name-attribute 是确保 Spring Security OAuth2 可以正确识别和使用用户用户名的重要步骤。
3.开启oauth2登录
新建一个SecurityConfig文件,内容如下
java
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http //表示所有请求都需要验证
.authorizeHttpRequests(authorize -> authorize
.anyRequest().authenticated()
)
// 运行请求后会自动跳转到第三方登录界面
.oauth2Login(Customizer.withDefaults());
return http.build();
}
}
这个也是配置,这个配置也很重要,内容也很多,这里就不展开讲了
你只要按照这三个步骤来,就可以实现第三方登录的功能了
下面演示看看
我在浏览器输入:http://localhost:8877,自动跳转到
输入账号密码后会自动跳回当前地址
那么接下来的问题就是登录成功后如何获取登录的用户信息?
写一个控制器接口
java
@RestController
@RequestMapping("/test")
@Slf4j
public class TestController {
@GetMapping("a")
public Object test(){
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
return authentication.getPrincipal();
}
}
文档中有说到的,当用户登录成功后,用户信息存储到哪里
https://docs.spring.io/spring-security/reference/5.7/servlet/authentication/architecture.html