超级简单的springboot整合springsecurity oauth2第三方登录

前言

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,我这里之所有设置版本号,主要是为了查看对应的文档。

有人可能会说,你怎么知道要引入这两个依赖?

这是我的一个总结,如果说想使用第三方的工具,首先要看它的官方文档,主要看什么呢?

  1. 它的简介,有助于了解工具的实现的功能
  2. 快速开始,任何一个工具使用起来都很简单,只是随着你的需求越多,其配置就越复杂罢了
  3. 提供的demo

有人说文档都是英文的看不懂,怎么办?

看不懂就去翻译

翻译了之后又看不懂呢?

那就去百度,结合百度上的一些文章,它可以让你更快的掌握这个工具。

话说回来,怎么知道引入这些依赖。说真的,springsecurity的文档并不友好,首先我去了 "OAuth2"这个菜单下找,发现并没有,然后就到它提供的demo上找

https://github.com/spring-projects/spring-security-samples/tree/main/servlet/spring-boot/java/oauth2/login

因为项目是使用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

上面这些配置,在你申请第三方密钥后都可以找得到,下面就简单说一下几个点

  1. registration:github和provider:github要对应,不能是provider:github1
  2. redirect-uri回调地址格式固定,localhost:8877表示你的域名,github要与registration:github中的github对应
  3. 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

我们运行一下接口http://localhost:8877/test/a,就会获取到你登录的git账号信息

相关推荐
小灰灰__4 分钟前
IDEA加载通义灵码插件及使用指南
java·ide·intellij-idea
夜雨翦春韭7 分钟前
Java中的动态代理
java·开发语言·aop·动态代理
程序媛小果28 分钟前
基于java+SpringBoot+Vue的宠物咖啡馆平台设计与实现
java·vue.js·spring boot
追风林33 分钟前
mac m1 docker本地部署canal 监听mysql的binglog日志
java·docker·mac
芒果披萨1 小时前
El表达式和JSTL
java·el
许野平1 小时前
Rust: 利用 chrono 库实现日期和字符串互相转换
开发语言·后端·rust·字符串·转换·日期·chrono
duration~1 小时前
Maven随笔
java·maven
zmgst2 小时前
canal1.1.7使用canal-adapter进行mysql同步数据
java·数据库·mysql
跃ZHD2 小时前
前后端分离,Jackson,Long精度丢失
java
blammmp2 小时前
Java:数据结构-枚举
java·开发语言·数据结构