二、OAuth2 client对接Spring Authorization Server

这里用的是授权码模式
搭建:Spring Authorization Server
代码结构如下:

在这里插入图片描述

代码实现

添加依赖

<dependency>                                                                        <groupId>org.springframework.boot</groupId>                                     <artifactId>spring-boot-starter-web</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-oauth2-client</artifactId>                      
</dependency>                                                                       

application.yml

server:port: 7100spring:security:oauth2:client:registration:demo-client-name:provider: democlient-id: demo-clientclient-secret: demo-secretauthorization-grant-type: authorization_coderedirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"scope: openid, profileclient-name: demo-client-nameprovider:demo:# 注意:这里写的是localhost, 不是127.0.0.1, 127有点问题issuer-uri: http://localhost:7000

UserController

@RestController
@RequestMapping("/user")
public class UserController {@GetMappingpublic Map<String, Object> hello() {Map<String, Object> map = new HashMap<>(4);map.put("name", "zhangsan");return map;}}

SecurityConfig

import org.springframework.context.annotation.Bean;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.oauth2.client.OAuth2AuthorizedClientManager;
import org.springframework.security.oauth2.client.OAuth2AuthorizedClientProvider;
import org.springframework.security.oauth2.client.OAuth2AuthorizedClientProviderBuilder;
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
import org.springframework.security.oauth2.client.web.DefaultOAuth2AuthorizedClientManager;
import org.springframework.security.oauth2.client.web.OAuth2AuthorizedClientRepository;
import org.springframework.security.web.SecurityFilterChain;/*** TODO description** @author qiudw* @date 7/11/2023*/
@EnableWebSecurity(debug = true)
public class SecurityConfig {@BeanOAuth2AuthorizedClientManager authorizedClientManager(ClientRegistrationRepository clientRegistrationRepository,OAuth2AuthorizedClientRepository authorizedClientRepository) {OAuth2AuthorizedClientProvider authorizedClientProvider =OAuth2AuthorizedClientProviderBuilder.builder().authorizationCode().refreshToken().clientCredentials().build();DefaultOAuth2AuthorizedClientManager authorizedClientManager = new DefaultOAuth2AuthorizedClientManager(clientRegistrationRepository, authorizedClientRepository);authorizedClientManager.setAuthorizedClientProvider(authorizedClientProvider);return authorizedClientManager;}@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.authorizeRequests(authorizeRequests ->authorizeRequests.anyRequest().authenticated())// 没有登录会重定向到这个地址.oauth2Login(oauth2Login ->oauth2Login.loginPage("/oauth2/authorization/demo-client-name")).oauth2Client(Customizer.withDefaults());return http.build();}}

浏览器访问:http://127.0.0.1:7100/user,会跳转到Spring Authorization Server,登录成功后重定向回来

OAuth2加上客户端重定向地址http://127.0.0.1:7100/login/oauth2/code/demo-client-name
在这里插入图片描述

客户端流程分析

  1. 浏览器访问:http://127.0.0.1:7100/user
    这里发现没有登录,重定向到:http://127.0.0.1:7100/oauth2/authorization/demo-client-name,这个地址就是loginPage配置的那个
    在这里插入图片描述

  2. 浏览器重定向访问:http://127.0.0.1:7100/oauth2/authorization/demo-client-name
    过滤器里面根据demo-client-name获取配置信息, client_id、client_secret等, 并拼接重定向地址
    在这里插入图片描述

  3. 浏览器重定向访问: http://localhost:7000/oauth2/authorize?response_type=code&client_id=demo-client&scope=openid%20profile&state=1mRvHfxZ4ud_5JO0T58SfrGL3rwcM32tCky4k7BrPgI%3D&redirect_uri=http://127.0.0.1:7100/login/oauth2/code/demo-client-name&nonce=ytlehR4Wv0lTLaPEWyq3Z_-xGYfSlmrmAqJFfEZTWsk
    这个地址就是授权码模式获取授权码的那个地址,OAuth server发现没有登录,则重定向到登录页面
    在这里插入图片描述

  4. 浏览器重定向访问:http://localhost:7000/login
    在这里插入图片描述

  5. 用户名密码认证
    在OAuth2 Server端完成登录后, 重定向回客户端

  6. 浏览器重定向访问:http://127.0.0.1:7100/login/oauth2/code/demo-client-name?code=QIAV0G_gBhDbdkxl6E2TMSezJT8DViNVNDa-3zZAYvAI5oCoLczRpKIjhqQSsMYaMekA0smpjUFRReCyQrXASL8KHg5jq1ge9UWmaTLqX7dZbv4QM30ZVfOwdwXU8pem&state=1mRvHfxZ4ud_5JO0T58SfrGL3rwcM32tCky4k7BrPgI%3D
    这个code就是携带的授权码
    在这里插入图片描述

  7. 客户端内部使用授权码换取token

  8. 重定向到 /user,未登录时访问的地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/18824.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring WebFlux 实现原理与架构图

启动原理与架构图 通过spring-boot-autoconfigure中的spring.factories文件&#xff0c;通过Spring Boot自动初始化下列类&#xff1a;HttpHandlerAutoConfiguration、ReactiveWebServerFactoryAutoConfiguration、WebFluxAutoConfiguration、ErrorWebFluxAutoConfiguration、…

ARM day9 (按键中断控制led亮灭)

key.h #ifndef __KEY_H__ #define __KEY_H__#include "stm32mp1xx_gpio.h" #include "stm32mp1xx_rcc.h" #include "stm32mp1xx_uart.h" #include "stm32mp1xx_exti.h" #include "stm32mp1xx_gic.h"//事件号 #define EXTI_…

学无止境·MySQL④(多表查询)

多表查询试题 试题一1、创建表2、表中添加数据3、查询每个部门的所属员工4、查询研发部门的所属员工5、查询研发部和销售部的所属员工6、查询每个部门的员工数,并升序排序7、查询人数大于等于3的部门&#xff0c;并按照人数降序排序 试题一 1、创建表 use mydb3; – 创建部门…

NAT介绍

目录 NAT NAT的配置——配置位置都是在边界路由器的出接口上进行配置 静态NAT 动态NAT——多对多的NAT NAPT——easy IP 多对多的NAPT 端口映射——高级用法 NAT——网络地址转换 IPV4地址不够用 NAT ABC——三类地址中截取了一部分地址&#xff08;并且让这一部分地址可以重复…

MySQL-分库分表详解(一)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

【数据结构】24王道考研笔记——串

四、串 串的定义 串&#xff08;字符串&#xff09;是由零个或多个字符组成的有限序列。 子串&#xff1a;串中任意个连续的字符组成的子序列主串&#xff1a;包含子串的串字符在主串中的位置&#xff1a;字符在串中的序号子串在主串中的位置&#xff1a;子串的第一个字符在…

docker 里面各种 command not found 总结

一、ip&#xff1a;command not found 执行命令&#xff1a; apt-get update & apt-get install -y iproute2 二、yum&#xff1a;command not found 执行命令&#xff1a; apt-get update & apt-get install -y yum 三、ping&#xff1a;command not found 执行命…

一、简易搭建本地CAS服务端

CAS服务端war包下载 https://repo1.maven.org/maven2/org/apereo/cas/cas-server-webapp-tomcat/5.3.14/ 可使用迅雷下载cas-server-webapp-tomcat-5.3.14.war &#xff0c;速度很快 将wab包放到本地tomcat的webapps下D:\tomcat\apache-tomcat-8.5.63\webapps\cas\WEB-INF\clas…

解决Anaconda第三方库下载慢

1.打开Anconda Prompt&#xff0c;进入后台 2.执行命令第一个是添加一个清华镜像&#xff0c;第二个设置在 conda 显示通道的 URL。 &#xff08;1&#xff09;conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ &#xff08;2&#xff0…

RocketMQ5.0消息存储<四>_刷盘机制

RocketMQ5.0消息存储<四>_刷盘机制 一、刷盘概览 RocketMQ存储与读写是基于JDK NIO的内存映射机制(MappedByteBuffer),消息存储时首先将消息追加到文件内存映射(commit操作),再根据配置的刷盘策略在不同时间进行刷写到磁盘(flush操作)。同步刷盘,消息提交到文件内…

【每天40分钟,我们一起用50天刷完 (剑指Offer)】第二十二天 22/50

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

C#核心知识回顾——12.lambda表达式、List排序、协变和逆变

1.Lambda表达式 可以将lambad表达式理解为匿名函数的简写 它除了写法不同外&#xff0c;使用上和匿名函数一模一样 都是和委托或者事件配合使用的 //匿名函数 //delegate&#xff08;参数列表&#xff09; //{ //} //lambda表达式 //(参数列表) > //{ //函数体 //…