Spring Security OAuth2 统一登录

news/2024/11/14 22:02:43/
介绍

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/news/1443547.html

相关文章

Python网络爬虫-re正则匹配数据

目录 前言 什么市正则表达式? 常见正则表达式元字符表 匹配字符 元字符 特定构造 Python常用的re正则匹配函数库 1. re.match(pattern, string) 2. re.search(pattern, string) 3. re.findall(pattern, string) 4. re.finditer(pattern, string) 5. re.split(pattern, string…

Yolov5简单部署(使用自己的数据集)

一.注意事项 1.本文主要是引用大佬的文章(侵权请联系,马上删除),做的工作为简单补充 二.正文 1.大体流程按照 准备:【简单易懂,一看就会】yolov5保姆级环境搭建_哔哩哔哩_bilibili 主要过程&#xff1…

Qt绘图与图形视图之移动鼠标手动绘制任意多边形的简单介绍

往期回顾 【QT进阶】Qt线程与并发之QtConcurrent返回值与run方法的参数说明-CSDN博客 Qt绘图与图形视图之绘图技术知识点的简单介绍-CSDN博客 Qt绘图与图形视图之常见图形、路径、文字、图片的绘制介绍-CSDN博客 Qt绘图与图形视图之移动鼠标手动绘制任意多边形的简单介绍 一、…

如何免费生成文本二维码?文字生成二维码的方法

随着信息技术的不断发展,文本二维码作为一种简便、高效的信息分享方式,受到了越来越多人的关注和应用。文本二维码是将文本信息编码成二维码的形式,通过扫描二维码即可快速获取文本内容,为信息分享和传播提供了全新的可能性。 便…

Internet Download Manager v6.42.7(IDM)一款功能强大的下载工具!

软件介绍 Internet Download Manager (IDM)是一个将下载速度提高多达5倍,恢复和提高下载进度的工具。能将由于连接丢失、网络问题、计算机关闭或意外断电而中断的下载全面恢复重新启动。凭借着下载计算的速度优势在外媒网站中均受好评&#…

前端项目学习记录1:svg图标的封装与使用

1.下载svg依赖 pnpm i vite-plugin-svg-icons -D 还有一个,下面的不安装可能会报错 pnpm i fast-glob -D 2.vite.config.ts配置 import { defineConfig } from vite import vue from vitejs/plugin-vue import path from "path"; //引入svg需要用到的…

数据分析:扩增子分析(qiime2平台全流程分析)

Amplicon sequencing analysis pipeline through qiime2 platform qiime2是扩增子数据分析的最佳平台之一,其提供了大量从原始data到统计分析的插件,尤其是它的可重复分析且可扩展插件的理念使得其成为扩增子分析首选的平台。 Platform qiime2是扩增子…

SpringMVC基础篇(三)

文章目录 1.SpringMVC映射请求数据1.获取请求头信息1.VoterHandler.java2.request_parameter.jsp3.结果展示 2.自动封装javabean1.需求分析2.应用实例1.Master.java2.Pet.java3.后端接口4.结果展示 3.底层机制 3.调用servlet-api1.基本说明2.代码实例1.接口2.结果展示 3.注意事…