SpringSecurity原理

最近在研究SpringSecurity,肝了好多天,算是有点收获,在这里分享下

SpringSecurity是什么?

SpringSecurity是一个强大的可高度定制的认证和授权框架,对于Spring应用来说它是一套Web安全标准。SpringSecurity注重于为Java应用提供认证和授权功能,像所有的Spring项目一样,它对自定义需求具有强大的扩展性。

要对Web资源进行保护,最好的办法莫过于Filter要想对方法调用进行保护,最好的办法莫过于AOP。

SpringSecurity其核心就是一组过滤器链,在spring security中一种过滤器处理一种认证方式,项目启动后将会自动配置

Spring Security进行认证和鉴权的时候,就是利用的一系列的Filter来进行拦截的。

如图所示,一个请求想要访问到API就会从左到右经过蓝线框里的过滤器,其中绿色部分是负责认证的过滤器,蓝色部分是负责异常处理,橙色部分则是负责授权。经过一系列拦截最终访问到我们的API。这里面我们只需要重点关注两个过滤器即可:UsernamePasswordAuthenticationFilter负责登录认证,FilterSecurityInterceptor负责权限授权。 

这里面我们只需要重点关注两个过滤器即可:UsernamePasswordAuthenticationFilter负责登录认证,FilterSecurityInterceptor负责权限授权。

一般Web应用的需要进行认证和授权。

​ 认证(Authentication):验证当前访问系统的是不是本系统的用户,并且要确认具体是哪个用户

​ 授权(Authorization):经过认证后判断当前用户是否有权限进行某个操作

​ 而认证和授权就是SpringSecurity作为安全框架的核心功能。

 

说明:Spring Security的核心逻辑全在这一套过滤器中,过滤器里会调用各种组件完成功能,掌握了这些过滤器和组件你就掌握了Spring Security!这个框架的使用方式就是对这些过滤器和组件进行扩展。

认证

登录流程:

  1. 通过用户输入的用户名和密码去和数据库中的数据进行比对,登录认证成功之后根据用户名和密码通过jwt生成一个token返回给前端(前端每次请求都会携带token到请求里面),同时将token存入redis(其中用户id作为key,用户信息作为value)(主要是为了不让后续的校验流程频繁的查询数据库)
  2. 这里的UserDetailsService默认是去查内存来认证用户名和密码的,需要自定义UserDetailsService这个接口去查自己的数据库的数据进行认证

校验流程:

  1. 前端每次发送请求的时候,请求头都会携带token。
  2. 后端通过jwt解析出用户的id,然后从redis根据key去拿到用户信息
  3. 通过用户的信息查询用户可以使用的权限,然后返回给前端去访问能访问的资源

前后端进行认证的流程:

整体流程:

其中:

  • Authentication接口:它的实现类,表示当前访问系统的用户,封装了用户相关信息。
  • AuthenticationManager接口:定义了认证Authentication的方法。
  • UserDetailsService接口:加载用户特定数据的核心接口。里面定义了一个根据用户名查询用户信息的方法。
  • UserDetails接口:提供核心用户信息。通过UserDetailsService根据用户名获取处理的用户信息要封装成UserDetails对象返回。然后将这些信息封装到Authentication对象中。

SpringSecurity的配置类

spring security和spring mvc做了很好的集成,一共只需要做两件事,给web配置类加上@EanbleWebSecurity,继承WebSecurityConfigurerAdapter定义个性化配置。这里我们在加上一个全局的注解@EnableGlobalMethodSecurity(prePostEnabled=true),该注解会在方法执行前进行验证。

  • configure(HttpSecurity httpSecurity):用于配置需要拦截的url路径、jwt过滤器及出异常后的处理器;
  • configure(AuthenticationManagerBuilder auth):用于配置UserDetailsService及PasswordEncoder;
  • UserDetailsService: SpringSecurity定义的核心接口,用于根据用户名获取用户信息,需要自行实现;
  • UserDetails:SpringSecurity定义用于封装用户信息的类(主要是用户信息和权限),需要自行实现;
  • PasswordEncoder:SpringSecurity定义的用于对密码进行编码及比对的接口,目前使用的是BCryptPasswordEncoder;
  • JwtAuthenticationTokenFilter:在用户名和密码校验前添加的过滤器,如果有jwt的token,会自行根据token信息进行登录。

 与SpringSecurity相关的原理大致就这么多,解下来我写具体的使用步骤

参考:

Spring Boot Security - 废物大师兄 - 博客园 (cnblogs.com)

@PreAuthorize 权限控制的原理 - 简书

整合SpringSecurity和JWT实现登录认证和授权_jwtauthenticationtokenfilter_Java升级之路的博客-CSDN博客

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

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

相关文章

word文件怎么免费转换为pdf格式?

大家在编辑word文件的时候,可能需要进行格式的转换,比如将word转换为pdf格式这时候需要使用工具软件。接下来小编就给大家介绍word文件怎么免费转换为pdf格式,免费word转pdf格式的方法。 免费word转pdf格式的方法 我们需要在电脑中安装并打开…

SpringCloud学习笔记(三)_服务提供者集群与服务发现Discovery

服务提供者集群 既然SpringCloud的是微服务结构,那么对于同一种服务,当然不可能只有一个节点,需要部署多个节点 架构图如下: 由上可以看出存在多个同一种服务提供者(Service Provider) 搭建服务提供者集…

第 7 章 排序算法(5)(希尔排序)

7.8希尔排序 7.8.1简单插入排序存在的问题 我们看简单的插入排序可能存在的问题. 数组 arr {2,3,4,5,6,1} 这时需要插入的数 1(最小), 这样的过程是: {2,3,4,5,6,6} {2,3,4,5,5,6} {2,3,4,4,5,6} {2,3,3,4,5,6} {2,2,3,4,5,6} {1,2,3,4,5,6} 结论: 当需要插入的数…

Spring Boot整合RabbitMQ之发布与订阅模式

RabbitMQ的模式中,常用的模式有:简单模式,发布与订阅模式,工作模式,路由模式,主题模式。简单模式不太会运用到工作中,我们可以使用 RabbitMQ 的发布订阅模式,实现: 用户…

android cocoscreator 检测模拟器还是真机

转载至 一行代码帮你检测Android模拟器 具体原理看原博主文章,这里只讲cocoscreator3.6的安卓工程怎么使用 1.新建一个com.lahm.library包,和com.cocos.game同目录,如图示 那四个文件的代码如下: EmulatorCheckUtil类&#…

【Unity】制作一个简单的菜单栏页面并实现其功能

这是一个简单的菜单页面制作,接下来我们将制作一个完整的菜单页面,并且通过一定的代码去实现它对应的效果。这个主要的功能就是我们在游戏中如果想暂停一下或者重新开始,那么就要用到我们这个功能。接下来我们将实现在游戏中按ESC退出键可以调…

Linux Kernel的local_irq_enable()和local_irq_disable()函数

代码如下图所示,最终操作的是msr daifset, #3 和 msr daifclr, #3 寄存器。 (include/linux/irqflags.h) #define local_irq_enable() do { raw_local_irq_enable(); } while (0) #define local_irq_disable() do { raw_local_irq_disable(); } while (0)#define ra…

解决SEGGER Embedded Studio无法显示Nordic MCU外设寄存器问题

如果使用SES调试NRF52840的时候发现,官方例程只能显示CPU寄存器,但是无法显示外设寄存器时,解决办法如下: 1.在解决方案右键→Options→Debug→Debugger,然后Target Device选择正确的型号。 2.Register Definition Fil…

10个最好的云GPU服务

随着深度学习、人工智能和机器学习等新技术的出现,云 GPU 的需求量很大。 GPU(图形处理单元)是专用处理器,用于处理计算机图形和游戏等活动所需的大量数据集和复杂计算。不过,它们现在对人工智能(A.I.&…

【C++】命名空间 namespace 与 标准流 iostream ( 命名空间概念简介 | 命名空间定义 | 命名空间使用 | iostream 中的命名空间分析 )

文章目录 一、命名空间 namespace1、命名空间基本概念2、名称概念4、C 语言的命名空间3、命名空间避免标识符冲突 二、命名空间定义1、命名空间基本概念2、命名空间定义语法3、代码示例 - 命名空间定义使用 三、命名空间使用1、命名空间默认访问方式2、使用命名空间3、使用默认…

实战项目ssm权限系统 3-总结篇,权限模块保护业务模块

一 工程模块介绍 1.1 工程模块关系 在业务微服务模块中引入安全认证模块,起到对业务模块的认证授权保护

在线设计APP ui的网站,分享这7款

在数字时代,用户界面(UI)设计变得非常重要,因为良好的UI设计可以改善用户体验,增强产品吸引力。随着科学技术的发展,越来越多的应用在线设计网站出现,为设计师和团队提供了一种新的创作方式。本…

postgresql基于postgis常用空间函数

1、ST_AsGeoJSON 图元转geojson格式 select ST_AsGeoJSON(l.geom) from g_zd l limit 10 2、 ST_Transform 坐标转换 select st_transform(l.shape, 3857) from sde_wf_cyyq l limit 10select st_astext(st_transform(l.shape, 3857)) from sde_wf_cyyq l limit 103、st_aste…

使用动态IP是否会影响网络

今天我们要谈论的话题是关于动态IP和网络的关系。也许有些小伙伴对这个概念还比较陌生,但别担心,我会简单明了的给你理清楚。让我们一起看看动态IP到底能否影响到网络。 首先,我们先来搞明白什么是动态IP。在互联网世界中,每一个连…

【NLP】1、BERT | 双向 transformer 预训练语言模型

文章目录 一、背景二、方法 论文:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 出处:Google 一、背景 在 BERT 之前的语言模型如 GPT 都是单向的模型,但 BERT 认为虽然单向(从左到右预测…

WPF中手写地图控件(3)——动态加载地图图片

瓦片增加一个Loading动画 可以查看我的另一个博客WPF中自定义Loading图 从中心扩散 进行从里到外的扩散,方向是上左下右。如下图所示 于是我们可以定义一个拥有坐标X跟Y的集合,他允许这个集合,内部使用枚举器的MoveNext自动排序&#xf…

stm32之5.长按按键(使用时钟源)调整跑马灯速度

------------------------------ 源码 #include <stm32f4xx.h> #include "led.h" #include "delay.h" #include "my_str.h" #include "beep.h" #include "key.h" int main(void) { key_init(); Led_init();…

Ubuntu-Server 22.04安装详细过程-图文版

一.下载Ubuntu Server镜像&#xff0c;官方地址下载即可 https://ubuntu.com/download/server 乌班图镜像网址&#xff0c;点击下载即可 二.安装乌班图镜像&#xff0c;最好自己准备u盘在ISO软件内制作完成 1.选择 Install Ubuntu Server 2.选择安装语言为英语 3.安装程序更新选…

数据库第十五课-------------非关系型数据库----------Redis

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

港联证券|指数或进入磨底阶段 短期关注环保、煤炭等板块

磨底历来都不是一天能达到的&#xff0c;比方2018年的政策底到商场底&#xff0c;半途也阅历两个多月时间。当下政策底出现之后至今也有近一个月时间&#xff0c;并且下跌量能不断缩短&#xff0c;心情面也降至冰点&#xff0c;种种迹象阐明离真正商场底的构成已经不远了。此时…