当前位置: 首页 > news >正文

浅聊授权-spring security和oauth2

文章目录

  • 前言
  • 自定义授权
  • spring security授权
  • oauth2授权
  • 概述

前言

通常说到授权,就会想到登录授权、token令牌、JWT等概念,授权。顾名思义就是服务器授予了客户端访问资源的权益,那么要实现授权有几种方案呢,三种授权方式在公司项目中我都遇到过,在这里我浅谈一二。

自定义授权

自定义授权,也就是自己完成授权相关的工作,包括登录身份验证、加密、令牌发放、令牌校验、访问资源权限校验等工作。

自定义授权在我看来就是自由发挥,自己升级,结构定义超级自由,但是缺点也很明显,容易出现出现漏洞或者在不严谨的情况下可能出现后台人员可以盗取用户信息的问题,比如明文密码。

我这里举例一下场景:基于jwt令牌的自定义授权。关键的步骤有两个,一是发放令牌,二是令牌验证。大概的流程如下
在这里插入图片描述

spring security授权

spring security授权,其实就是使用spring提供的安全框架依赖spring-cloud-starter-security,如果是单体服务换成可换成单体服务可以换成spring-boot-starter-security依赖。

spring security做了什么呢,其实就是将授权这件事做成一个模式并简化了使用,一个注解@EnableWebSecurity就能把一堆可能需要考虑的东西都给你考虑了,比如加密方式、跨域、请求校验、默认登录页等等问题,在使用的时候,只需要按照定好的框架里加对应的东西即可,比如BCryptPasswordEncoder加密。如果使用最新版本的security,其实这些都不用考虑,配置好UserDetailService,开箱即用。

使用spring security的好处在于降低风险,而且spring security是跟着版本升级的,可以不断享受可能的隐藏福利。如果有人想问,这个与自定义的授权,有什么根本上的区别吗,答案是没有,security只是默默在后面奉献。

oauth2授权

oauth2之所以加一个数字,是因为之前有一个oauth,这个是升级版本,都是免费的,当然用oauth2啦。说到oauth2,就不得不说oauth2与spring的关系,oauth2是在spring security基础上搭建的一套授权方案,spring也是非常欢迎oauth2的加入,只要引入spring-cloud-starter-oauth2即可使用,但是只更新到2021年,因为spring认为spring security只做基础框架,不参与授权方案的具体实现,结果网上一阵沸腾,不过新版的spring又拥抱了oauth2,那就是spring-boot-starter-oauth2-authorization-server。

spring security虽然默认支持密码登录,但是远远不满足需求,oauth2就是在spring security的做一些授权补充,支持四种授权模式:密码模式、客户端模式、授权码模式、隐藏式模式,不过oauth不建议使用隐藏式模式,风险比较大。如果使用过oauth2的小伙伴会发现刷新token也是一种授权模式,但其实这只是密码模式的一种叠加,实现客户端永不掉线。

概述

不管是自定义授权还是基于spring security授权,都没有授权服务和资源服务的区分,但是oauth2是有这个概念的,单从依赖就可以看出分为server、client、resource,三者各司其职,但是实际使用也可以打破这个概念。按照oauth2的设计,微服务中需要独立一个服务作为授权服务,假设有需要将用户服务与授权服务当做一个服务,其实也可以将授权服务当做一个资源,但是这个时候需要自己稍做自定义。

关于技术选型,我建议先看公司项目的方向,如果每个项目相互独立,并且没有第三方访问资源的场景,那么直接使用spring security即可,oauth2会显得太臃肿。假设公司想做一个独立的授权中心,或者有给第三方授权的需求,或者是项目之间对接的场景,就可以采用oauth2。如果说不确定未来的发展方向,要么先用spring security,后续无法满足的话再使用oauth2,要么一开始就使用oauth2,秉承“可以不用但不能没有”的精髓。

相关文章:

浅聊授权-spring security和oauth2

文章目录 前言自定义授权spring security授权oauth2授权概述 前言 通常说到授权,就会想到登录授权、token令牌、JWT等概念,授权。顾名思义就是服务器授予了客户端访问资源的权益,那么要实现授权有几种方案呢,三种授权方式在公司项…...

时间复杂度计算

目录 时间复杂性 ⼤O的渐进表⽰法 时间复杂性 定义:在计算机科学中,算法的时间复杂度是⼀个函数式T(N),它定量描述了该算法的运⾏时间。 时间复杂度是衡量程序的时间效率,那么为什么不去计算程序的运⾏时间呢? 1.…...

React 18 + Babel 7 + Webpack 5 开发环境搭建

文章目录 一、基础开发环境搭建1. 新建项目目录2. 项目目录结构及内容3. 安装 React 18 Babel 7 Webpack 54. 配置 Babel 和 Webpack5. 调试/构建项目 二、扩展项目支持的能力(待补充)1. JS 扩展(待补充)2. CSS 扩展&#xff08…...

MongoDB Shard 集群 Docker 部署

MongoDB Shard Docker 部署 部署环境 主机地址主机配置主机系统Mongodb1/192.168.31.1352CPU 4GBDebian12Mongodb2/192.168.31.1092CPU 4GBDebian12Mongodb3/192.168.31.1652CPU 4GBDebian12 镜像版本 mongodb/mongodb-community-server:5.0.27-ubuntu2004 部署集群 部署…...

MacOS 开发 — Packages 程序 macOS新版本 演示选项卡无法显示

MacOS 开发 — Packages 程序 macOS新版本 演示选项卡无法显示 问题描述 : 之前写过 Packages 的使用以及如何打包macOS程序。最近更新了新的macOS系统,发现Packages的演示选项卡无法显示,我尝试从新安转了Packages 也是没作用,…...

Hive的分区表分桶表

1.分区表: 是Hive中的一种表类型,通过将表中的数据划分为多个子集(分区),每个分区对应表中的某个特定的列值,可以提高查询性能和管理数据的效率。分区表的每个分区存储在单独的目录中,分区的定义…...

PostgreSQL17索引优化之支持并行创建BRIN索引

PostgreSQL17索引优化之支持并行创建BRIN索引 最近连续写了几篇关于PostgreSQL17优化器改进的文章,其实感觉还是挺有压力的。对于原理性的知识点,一方面是对这些新功能也不熟悉,为了尽可能对于知识点表述或总结做到准确,因此需要…...

在Vue中,子组件向父组件传递数据

在Vue中,子组件向父组件传递数据通常通过两种方式实现:事件和回调函数。这两种方式允许子组件与其父组件进行通信,传递数据或触发特定的行为。 1. 通过事件传递数据 子组件可以通过触发自定义事件,并将数据作为事件的参数来向父组…...

数据结构(顺序表)

谈起顺序表,那我们就不得不先来了解一下它的上级概念---线性表 线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是⼀种在实际中⼴泛使⽤的数据结构,常⻅的线性表:顺序表、链表、栈、队列…...

MySQL之基本查询(上)-表的增删查改

目录 Create(创建) 案例建表 插入 单行数据 指定列插入 单行数据 全列插入 多行数据 全列插入 插入是否更新 插入时更新 替换 Retrieve(读取) 建表插入 select列 全列查询 指定列查询 查询字段为表达式 为查询结果指定别名 结果去重 where条件 比较运算符 逻辑运…...

RocketMQ源码学习笔记:Producer发送消息流程

这是本人学习的总结,主要学习资料如下 马士兵教育rocketMq官方文档 目录 1、Overview2、验证消息3、查找路由4、选择消息发送队列4.1、选择队列的策略4.2、源码阅读4.2.1、轮询规避4.2.2、故障延迟规避4.2.2.1、计算规避时间4.2.2.2、选择队列 4.2.3、ThreadLocal的…...

kotlin flow collect collectLatest 区别

在 Kotlin 协程库中,collect 和 collectLatest 都是用于收集 Flow 中发射的数据的方法,但它们在处理数据和响应新数据的方式上有所不同。 collect collect 是一个挂起函数,用于收集 Flow 中发射的所有数据。它会按顺序处理每一个发射的数据…...

ELK集群搭建

ELK集群搭建 文章目录 ELK集群搭建1.环境准备2.Elasticsearch环境搭建1.创建es账户并设置密码2.选择对应版本进行下载3.编辑配置文件4.设置JVM堆大小 #7.0默认为4G5.创建es数据及日志存储目录6.修改安装目录和存储目录权限 3.系统优化1.增加最大文件打开数2.增加最大进程数3.增…...

zookeeper+kafka消息队列集群部署

一.消息队列 1、什么是消息队列 消息(Message)是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。 消息队列(MessageQueue)是一种在软件系统中用…...

LLM_入门指南(零基础搭建大模型)

本文主要介绍大模型的prompt,并且给出实战教程。即使零基础也可以实现大模型的搭建。 内容:初级阶段的修炼心法,帮助凝聚和提升内力,为后续修炼打下基础。 1、prompt 1.1含义和作用 prompt就是提示工程的意思。在大型语言模型中…...

Element Plus 与 Vue 3:构建现代化 Web 应用的完美搭档

引言 Element Plus是基于Vue 3的组件库,它继承了Element UI的优秀基因,为Vue 3应用提供了丰富的界面组件。Element Plus不仅拥有与Element UI相同的高质量组件,还针对Vue 3进行了优化和更新,确保了与Vue 3的无缝集成。 环境准备…...

线程间通信与变量修改感知:几种常用方法

线程间通信与变量修改感知:几种常用方法 1. 使用volatile关键字2. 使用synchronized关键字3. 使用wait/notify/notifyAll机制4. 使用轮询(Polling) 💖The Begin💖点点关注,收藏不迷路💖 在Java…...

前后端通信 —— HTTP/HTTPS

目录 一、HTTP/HTTPS 简介 1、HTTP 2、HTTPS 二、HTTP 工作过程 三、HTTP 消息 1、HTTP消息结构 2、HTTP消息示例 四、HTTP 方法(常用) 1、GET 2、POST 3、PUT 4、DELETE 5、GET与POST对比 五、HTTP 状态码(常用) …...

人工智能 (AI) 应用:一个高精度ASD 诊断和照护支持系统

自闭症谱系障碍(ASD)是一种多方面的神经发育状况,影响全球大约1/100的儿童,而在中国,这一比例高达1.8%(引用自《中国0~6岁儿童孤独症谱系障碍筛查患病现状》),男童为2.6%…...

C# 1.方法

方法组成: 1.修饰符:public一般定义共有的 2.方法返回值:void 无返回值; 非void,可以写成其他类型例如int,float,string,string[]等 3.方法名:Add 大驼峰命名法,每一个首字符大写。…...

【C++进阶学习】第七弹——AVL树——树形结构存储数据的经典模块

二叉搜索树:【C进阶学习】第五弹——二叉搜索树——二叉树进阶及set和map的铺垫-CSDN博客 目录 一、AVL树的概念 二、AVL树的原理与实现 AVL树的节点 AVL树的插入 AVL树的旋转 AVL树的打印 AVL树的检查 三、实现AVL树的完整代码 四、总结 前言&#xff1a…...

px,em,rem之间的关系换算

px,em,rem之间的换算 px&#xff1a;普通大小 em&#xff1a;相对单位&#xff0c;相对于父元素的字体大小 rem&#xff1a;相对单位&#xff0c;相对于根元素&#xff08;html&#xff09;的字体大小 <!DOCTYPE html> <html lang"en"> <head>…...

HTTP——POST请求详情

POST请求 【传输实体文本】向指定资源提交数据进行处理请求&#xff08;例如提交表单或者上传文件&#xff09;。数据被包含在POST请求体中。POST 请求可能会导致新的资源的建立或已有资源的修改。 场景&#xff1a; 1. 提交用户注册信息。 2. 提交修改的用户信息。 常见的…...

外包干了1个月,技术明显退步。。。

有一种打工人的羡慕&#xff0c;叫做“大厂”。 真是年少不知大厂香&#xff0c;错把青春插稻秧。 但是&#xff0c;在深圳有一群比大厂员工更庞大的群体&#xff0c;他们顶着大厂的“名”&#xff0c;做着大厂的工作&#xff0c;还可以享受大厂的伙食&#xff0c;却没有大厂…...

LeetCode加油站(贪心算法/暴力,分析其时间和空间复杂度)

题目描述 一.原本暴力算法 最初的想法是&#xff1a;先比较gas数组和cost数组的大小&#xff0c;找到可以作为起始点的站点(因为如果你起始点的油还不能到达下一个站点&#xff0c;就不能作为起始点)。当找到过后&#xff0c;再去依次顺序跑一圈&#xff0c;如果剩余的油为负数…...

5.1 软件工程基础知识-软件工程概述

软件工程诞生原因 软件工程基本原理&#xff08;容易被考到&#xff09; 软件生存周期 能力成熟度模型 - CMM 能力成熟度模型 - CMMI 真题...

HttpUtil工具

http工具 用到的依赖 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version></dependency><dependency><groupId>org.apache.httpcomponent…...

并发编程-锁的分类

锁的分类 可重入锁&不可重入锁 可重入&#xff1a;当一个线程获取某个锁后&#xff0c;再次获取这个锁的时候是可以直接拿到的。不可重入&#xff1a;当一个线程获取某个锁之后&#xff0c;再次获取这个锁的时候拿不到&#xff0c;必须等自己先释放锁再获取。synchronized…...

K8S系列-Kubernetes基本概念及Pod、Deployment、Service的使用

一、Kubernetes 的基本概念和术语 一、资源对象 ​ Kubernetes 的基本概念和术语大多是围绕资源对象 Resource Object 来说的&#xff0c;而资源对象在总体上可分为以下两类: 1、某种资源的对象 ​ 例如节点 Node) Pod 服务 (Service) 、存储卷 (Volume&#xff09;。 2、…...

在VSCode上创建Vue项目详细教程

1.前期环境准备 搭建Vue项目使用的是Vue-cli 脚手架。前期环境需要准备Node.js环境&#xff0c;就像Java开发要依赖JDK环境一样。 1.1 Node.js环境配置 1&#xff09;具体安装步骤操作即可&#xff1a; npm 安装教程_如何安装npm-CSDN博客文章浏览阅读836次。本文主要在Win…...