Spring Security OAuth2 统一登录

介绍

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.mzph.cn/pingmian/4797.shtml

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

相关文章

Java 集合中获取数据的前驱和后继元素

目录 1. NavigableSet 和 NavigableMap 2. ListIterator 3. ConcurrentSkipListSet 和 ConcurrentSkipListMap 4.示列 1. NavigableSet 和 NavigableMap 特性: NavigableSet 和 NavigableMap 接口提供了丰富的方法来获取给定元素的前驱和后继元素。higher(E e) 方法返回比给…

火力发电厂超低排放标准?

目录: 引言火力发电厂超低排放的背景与意义火力发电厂超低排放环保指标解析环保验收要求超低排放的重要性环保验收的流程与要点超低排放技术措施与应用火力发电厂超低排放的监测与评估环保验收中常见问题及解决方案案例分析:成功实现超低排放的火力发电…

uniapp分包,以及通过uni-simple-router进行分包

先说一下uniapp的直接分包方式,很简单: 配置分包信息 打开manifest.json源码视图,添加 “optimization”:{“subPackages”:true} 开启分包优化 我们在根目录下创建一个pagesA文件夹,用来放置需要分包的页面 然后配置路由 运行到…

Unity3d 学习之按钮绑定事件

创建测试脚本 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;public class myTest : MonoBehaviour {// Start is called before the first frame updatepublic Button _codeBindBtn null;void Start(){if (_codeBi…

020Node.js的FS模块使用fs.mkdir创建目录

Node.js的FS模块使用fs.mkdir创建目录 //fs.mkdir 创建目录 /*path 将创建的目录路径mode 目录权限(读写权限),默认777callback 回调,传递异常参数err*/ const fsrequire(fs);fs.mkdir(./css,(err)>{if(err){console.log(err)…

03.Kafka 基本使用

Kafka 提供了一系列脚本用于命令行来操作 kafka。 1 Topic 操作 1.1 创建 Topic 创建一个名为 oldersix-topic 的 topic,副本数设置为3,分区数设置为2: bin/kafka-topics.sh \ --create \ --zookeeper 192.168.31.162:2181 \ --replication…

深度学习之基于多模态融合的商品分类方法研究与实现

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 项目简介:深度学习之基于多模态融合的商品分类方法研究与实现 一、项目背景与目标 随着电子商务的快速…

HTML 标签通用属性

HTML 标签通用属性 通用HTML标签的属性 id 设定标签的ID name 设定标签的名称 class 设定标签样式的类选择器 style 设定标签样式属性 <basefont><font>标签通用的属性 face 用于文字的名称&#xff0c;可以是宋体、隶书、楷体等 size 用于设置字号的大小(从…

Polyscope,一款简洁的三维可视化工具!

Polyscope是用于三维数据&#xff08;如meshes、point clouds&#xff09;的可视化工具&#xff0c;通过编程或动态GUI完成&#xff1b;支持C和Python编程&#xff1b;追求“一行代码”为数据提供有用的可视界面展示。 下面来简单介绍Polyscope使用。 Polyscope效果 Point Cl…

【深度学习】【Lora训练1】StabelDiffusion,Lora训练过程,秋叶包,Linux,SDXL Lora训练

文章目录 一、环境搭建指南二、个性化安装流程三、启动应用四、打开web五、开始训练 19.27服务器 一、环境搭建指南 打造一个高效且友好的开发环境&#xff1a; 项目源码获取&#xff1a; 通过以下命令轻松克隆项目及所有子模块至您的Linux系统&#xff1a; git clone --recu…

主观赋权法、客观赋权法、组合赋权法、评价指标体系构建

在科研领域&#xff0c;为了对某个研究主题进行深入的探讨和评估&#xff0c;我们往往需要构建一套科学合理的评价体系&#xff0c;并为其中的各项评价指标赋予相应的权重。比如&#xff0c;在评价一项新技术的性能时&#xff0c;我们可能会考虑其创新性、实用性、成本效益等多…

牛客NC242 单词搜索【中等 递归DFS C++/Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/987f2981769048abaf6180ed63266bb2 思路 递归&#xff1a;以word第一个字符为起点&#xff0c;在矩阵中 递归搜索&#xff0c;检查是否存在完整的word路径&#xff0c; 注意恢复现场&#xff0c;又叫回溯&#…

【LAMMPS学习】八、基础知识(5.1)有限尺寸球形和非球形粒子

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

Gin的中间件执行流程与用法

一、背景 我们在使用Gin框架进行Web开发的时候&#xff0c;基本上都会遇到登录拦截的场景。 例如某些接口必须在登录以后才能访问&#xff0c;根据登录用户的信息以及权限&#xff0c;拿到属于自己的数据, 反之&#xff0c;没登录过则直接拒绝访问。 那么我们怎么做到这些登录…

Agent AI 智能体的未来

Agent AI智能体的未来可能会变得更加普遍和智能。以下是一些可能出现的趋势和发展方向&#xff1a; 1、个性化服务: Agent AI智能体可能会变得更加个性化&#xff0c;能够根据用户的偏好和习惯提供定制化的服务和建议。 2、多模态交互: 未来的Agent AI可能会支持更多的多模态交…

【麒麟(Linux)系统远程连接到windows系统并进行文件传输】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言使用步骤总结 前言 一般来说&#xff0c;windows自带远程桌面&#xff0c;使用的RDP协议&#xff0c;Linux上支持RDP协议的软件很多&#xff0c;常用的是Remmi…

陪丨玩丨系丨统搭建制作流程APP小程序H5多端源码前后端一次性交付,本地授权,无二次费用!可定制开发!

陪丨玩app小程序H5开发&#xff0c;软件搭建&#xff0c;程序制作、系统设计 数据存储是陪玩平台源码的重点&#xff0c;没有数据库&#xff0c;用户的账号信息、平台产生的数据都无法顺利存储和读取&#xff0c;不能让用户拥有完善良好的用户体验。虽然是存放在服务器上&…

python下常用的图像处理工具

在Python中&#xff0c;常用的图像处理工具有很多&#xff0c;以下是一些常见的和推荐的工具&#xff1a; OpenCV&#xff1a;OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是最流行的计算机视觉库之一&#xff0c;它包含大量的图像处理函数&#xff0c…

ThreeJs 环境配置及遇到问题的解决方法

一、环境搭建 ThreeJs在实际在实际使用中更多的是结合框架开发例如&#xff1a;vue框架、react框架&#xff0c;在使用时需要配置开发环境&#xff0c;本文使用的是vscode ThreeJs NodeJs vue 1、ThreeJs安装 下载路径&#xff1a;GitHub - mrdoob/three.js: JavaScript…

linux 创建管理员用户并使用生成秘钥登录服务器

一台新的云服务器&#xff0c;初始化登录的是root用户,现需要其他人登录该服务器但肯定不能也使用root权限登录&#xff0c;需要创建新的用户并给该用户生成秘钥并给与管理员的权限&#xff0c;通过ssh免密登录 要在Linux系统上创建新用户并赋予管理员权限&#xff08;sudo权限…