Spring Security OAuth2 统一登录

embedded/2024/9/23 10:30:16/
介绍

Spring Security OAuth2 是一个在 Spring Security 框架基础上构建的 OAuth2 授权服务器和资源服务器的扩展库。它提供了一套功能强大的工具和组件,用于实现 OAuth2 协议中的授权流程、令牌管理和访问控制。

Git地址:yunfeng-boot3-sercurity: Spring Security OAuth2 统一登录(授权码模式)

版本

SpringBoot 2.5.6

OAuth2重要角色
  • Authorization Server : 授权服务器。
  • Resource Server: 资源服务器。举例针对微服务里面各个业务子系统:用户系统、商家系统、商品系统、订单系统等等。
  • Client:客户端:浏览器、APP、小程序等等

具体实现

OAuth2 有多种授权模式。本实例中,使用授权码模式 + 授权服务器,来实现用户的认证。

主要接口:

  • 获取授权码:http://localhost:8080/auth/oauth/authorize?response_type=code&client_id=hello&redirect_uri=http://localhost:8080&scope=all
  • 获取token:http://localhost:8080/auth/oauth/token

首先,创建一个SpringBoot应用,作为授权服务器。集成SpringBoot 2.5.6 + MySQL + Spring Security + Redis。

  1. 配置AuthorizationServerConfigurerAdapter.

继承AuthorizationServerConfigurerAdapter 主要是针对授权服务器进行自定义配置。

  • 配置token的接口权限,允许进行客户端授权。每个token都是跟某一个客户端进行关联的。所以MySQL里面

需要增加一张表,并配置好需要授权的客户端记录.

表结构如下:

CREATE TABLE `oauth_client_details` (

`client_id` varchar(256) COMMENT '客户端ID',

`resource_ids` varchar(256),

`client_secret` varchar(256) COMMENT '客户端密钥',

`scope` varchar(256),

`authorized_grant_types` varchar(256) COMMENT '授权类型',

`web_server_redirect_uri` varchar(256),

`authorities` varchar(256),

`access_token_validity` int(11) COMMENT 'access_token的有效时间',

`refresh_token_validity` int(11) COMMENT 'refresh_token的有效时间',

`additional_information` varchar(4096),

`autoapprove` varchar(256) COMMENT '是否允许自动授权',

PRIMARY KEY (`client_id`) USING BTREE

) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `weef_iot_edge_shaoyifu`.`oauth_client_details` (`client_id`, `resource_ids`, `client_secret`, `scope`, `authorized_grant_types`, `web_server_redirect_uri`, `authorities`, `access_token_validity`, `refresh_token_validity`, `additional_information`, `autoapprove`) VALUES ('hello', 'order-resource', '$2a$10$Kc3YXJdKpWEtLFD.xBSlFO5.OD94MZ7zWdl9CiQ5OGlYvSuvM8qoi', 'all', 'authorization_code,password', 'http://localhost:8080', NULL, 3600, NULL, NULL, 'true');

授权服务器代码如下:

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {@Resourceprivate DataSource dataSource;@Resourceprivate RedisConnectionFactory redisConnectionFactory;private final static String TOKEN_STORE_PREFIX = "yf-token-store";@Overridepublic void configure(AuthorizationServerSecurityConfigurer security) throws Exception {// 开启/oauth/token_key验证端口无权限访问security.tokenKeyAccess("permitAll()")// 开启/oauth/check_token验证端口认证权限访问.checkTokenAccess("isAuthenticated()").allowFormAuthenticationForClients();}@Overridepublic void configure(ClientDetailsServiceConfigurer clients) throws Exception {clients.withClientDetails(clientDetailsService());}@Overridepublic void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {RedisTokenStore tokenStore = new RedisTokenStore(redisConnectionFactory);tokenStore.setPrefix(TOKEN_STORE_PREFIX);endpoints.tokenStore(tokenStore);}public ClientDetailsService clientDetailsService() {return new JdbcClientDetailsService(dataSource);}}

  1. 配置WebSecurityConfigurerAdapter

继承WebSecurityConfigurerAdapter,来实现用户信息的配置。这个简化实现。内置了用户名和密码。通过这个类,可以扩展到使用MySQL来时实现,用户名和密码的校验。

同时,针对Spring Security 内置登录页面。也可以通过配置这个类,实现自定义的登录页面。

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.inMemoryAuthentication().withUser("zhangsan").password(passwordEncoder().encode("123456")).roles("ADMIN").and().passwordEncoder(passwordEncoder());System.out.println(passwordEncoder().encode("123456"));}@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}}

  1. 获取code:通过浏览器访问:http://localhost:8080/auth/oauth/authorize?response_type=code&client_id=hello&redirect_uri=http://localhost:8080&scope=all

登录之后,可以拿到code

  1. 调用获取token接口:


http://www.ppmy.cn/embedded/22856.html

相关文章

Qt学习笔记1.3.1 Qt Core-容器类

文章目录 简介容器类迭代器类JAVA风格迭代器STL风格迭代器隐式共享问题 foreach关键字其他容器类算法复杂度增长策略 来源: https://doc.qt.io/archives/qt-5.12/containers.html 简介 Qt库提供基于模板的通用容器类,相比STL容器类更轻量化、安全和易用。 容器类…

理清STM32的内存(ram)与flash(rom)空间

keil工程变异代码的时候,会有如下输出信息 code:代码机器编译后生成的一系列指令,永远只放在flsah,内存ram不会存在; RO-data:只读常量,永远只放在flash内,存ram不会存在;; RW-dat…

学习笔记-数据结构-线性表(2024-04-24)

对不带头节点的单链表进行就地倒置 函数的处理步骤如下: 初始化三个指针 p、q 和 r。p 用于追踪新链表的最后一个节点,最初设置为 NULL。q 指向当前正在处理的原链表的节点,最初是链表的头节点。r 用于临时保存 q->next,即下一…

迭代加深算法(IDDFS)在电商商品推荐中的应用方案

在电商平台上应用迭代加深深度优先搜索(IDDFS)算法来探索用户可能感兴趣的商品路径,可以创建一个更加个性化和动态的推荐系统,提供更加个性化和动态的购物体验。 通过利用IDDFS来探索用户可能感兴趣的商品路径。通过限制搜索深度,系统可以逐步展示从用户当前查看的…

ZISUOJ 数据结构--队列及其应用

说明: 基本都是bfs的常见模板题型,思路都很直接,不过后面有两道题很搞心态,它们给的坐标x、y是反的,导致刚开始一直错。题目还是要看仔细,不能先入为主。 题目列表: 问题 A: 围圈报数(完善程序…

特征提取(Feature Extraction)应用场景笔记(二)

让我们以一个交通管理系统为例,说明如何基于统计特征、频域特征和时域特征设计数据表示。 假设我们有大量的交通流量数据,包括车辆的速度、密度、道路拥堵情况等指标。我们的任务是让强化学习代理学习交通流量模式,并根据数据做出智能的交通信…

408计算机组成原理知识点——第五章 中央处理器

文章目录 CPU的功能和基本结构CPU的功能运算器和控制器的功能运算器的基本结构专用数据通路方式CPU内部单总线方式运算器的基本结构 控制器的基本结构CPU的基本结构 指令执行过程指令周期指令周期流程指令周期的数据流取指周期间址周期执行周期中断周期 指令的执行方案 数据通路…

Milvus Cloud 向量数据库Reranker成本比较和使用场景

成本比较:向量检索 v.s. Cross-encoder Reranker v.s. 大模型生成 虽然 Reranker 的使用成本远高于单纯使用向量检索的成本,但它仍然比使用 LLM 为同等数量文档生成答案的成本要低。在 RAG 架构中,Reranker 可以筛选向量搜索的初步结果,丢弃掉与查询相关性低的文档,从而有…