SpringSecurity登录和校验流程简述

认证: 验证当前访问系统的是不是本系统的用户,并且要确认具体是哪个用户
授权: 经过认证后判断当前用户是否有权限进行某个操作

一、入门案例实现

搭建springboot工程后,创建启动类和Controller,引入SpringSecurity依赖
尝试访问Controller接口就会自动跳转到SpringSecurity的默认登录界面
输入用户名是user,密码会在控制台输出

1.1、登陆校验流程

登陆接口逻辑

携带用户名密码访问服务器,成功就会生成jwt并且返回给前端,
以后的请求就会在请求头携带token,只有获取到token中的用户信息才能确定是否有访问权限

SpringSecurity完整流程
原理是一个过滤器链,内部提供了各种功能的过滤器

下面看看入门案例的过滤器链
在这里插入图片描述

UsernamePasswordAuthenticationFilter:负责处理我们在登陆页面填写了用户名密码后的登陆请

ExceptionTranslationFilter:处理过滤器链中抛出的任何AccessDeniedException和
AuthenticationException 。
FilterSecurityInterceptor:负责权限校验的过滤器。

1.2、自定义登陆校验

在这里插入图片描述
第一步:验证用户名和密码正确性
实现UserDetailsService接口重写其中的loadUserByUsername方法,
从数据库查询用户名和密码,查询成功就返回一个UserDetails对象(因为重写的这个方法需要返回这个对象)
在这里插入图片描述
如果要测试,需要往用户表中写入用户数据,并且如果你想让用户的密码是明文存储,需要在密
码前加{noop}

第二步 有了上面的准备工作后,就设置SpringSecurity拦截除了登陆接口的一系列接口了
继承WebSecurityConfigurerAdapter类,然后重写其中的 configure方法

在这里插入图片描述

接下来实现登陆方法
需要经过authenticationManager.authenticate(authenticationToken);进行验证,注意这个方法返回的对象就是第一步实现的UserDetailsService返回的对象,这个方法的参数是authenticationToken,包含了用户名密码信息
当authenticate不为空就代表密码验证成功接下来就根据UserId生成token,并且将token返回给前端
以后前端每次的请求就会携带这个token
在这里插入图片描述
经过前面的三步,已经实现了拦截除登陆接口的所有方法,并且实现了登陆接口的逻辑
其中实现UserDetailsService接口重写其中的loadUserByUsername方法来定义如何检验密码
通过在SpringSecurity配置类的configure方法指定需要拦截的方法
实现登陆接口,就能保证当访问没有被拦截的登陆方法就能根据需要生成token,供给后续SpringSecurity拦截的方法判断是否有访问权限

第四步
自定义一个过滤器,过滤器会获取请求头中的token,对token进行解析获取其中的userId,然后根据这个userid去redis获取对应的LoginUser对象,然后封装Authentication对象存入SecurityContextHolder(可以后续登出的时候获取到用户信息)
然后在配置类中通过http.addFilterBefore(jwtAuthenticationTokenFilter将token校验过滤器添加到过滤器链中。到此就实现了登陆接口进行校验密码生成token,其他接口访问前需要校验token
该方法需要继承OncePerRequestFilter类重写其中的doFilterInternal方法

在这里插入图片描述

在这里插入图片描述

登出接口

获取SecurityContextHolder中的认证信息,删除redis中对应的数据即可。
在这里插入图片描述
到这一步一个基本的登陆功能就实现了,但是并没有权限系统

授权

授权基本流程

使用默认的FilterSecurityInterceptor来进行权限校验。在
FilterSecurityInterceptor中会从SecurityContextHolder获取其中的Authentication,然后获取其中的权限信息。当前用户是否拥有访问当前资源所需的权限。
所以我们在项目中只需要把当前登录用户的权限信息也存入Authentication。
然后设置我们的资源所需要的权限即可。

使用基于注解的权限控制方案,通过使用注解来指定对应的资源所需的权限

首先需要先开启相关配置。

@EnableGlobalMethodSecurity(prePostEnabled = true)

在对应的资源使用@PreAuthorize注解,表示访问该资源需要test权限
在这里插入图片描述
写死的情况
在先前的写UserDetailsServiceImpl查询用户后获取到对应的权限信息封装到1UserDetails返回时就可以直接把权限信息封装到UserDetails中返回
所以这次需要前定义了UserDetails的实现类LoginUser,在其中添加相关权限的信息
具体添加属性

@JSONField(serialize = false)
private List<GrantedAuthority> authorities;

注解确保序列化时不会转为JSON字符串,保证了隐私性
这样进一步我们就能在UserDetailsServiceImpl返回带有权限信息的LoginUser对象了
在UserDetailsServiceImpl返回信息时也会多下面这一步

List<String> list = new ArrayList<>(Arrays.asList("test"));
return new LoginUser(user,list);

从数据库查询权限信息

RBAC权限模型
基于角色的权限控制(具体应该是用户关联角色,角色关联权限)
所以可以在UserDetailsServiceImpl中去调用mapper的方法查询权限信息封装到LoginUser对象中即可,之后经过权限过滤器就可以校验权限了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Cache基本使用

Spring 从 3.1 版本开始定义缓存抽象来统一不同的缓存技术&#xff1b;在应用层面与后端存储之间&#xff0c;提供了一层抽象&#xff0c;这层抽象目的在于封装各种可插拔的后端存储( ehcache, redis, guava)&#xff0c;最小化因为缓存给现有业务代码带来的侵入。 一、Spring…

【代码随想录】面试常考类型之动态规划01背包

前言 更详细的在大佬的代码随想录 (programmercarl.com) 本系列仅是简洁版笔记&#xff0c;为了之后方便观看 不同的二叉搜索树 96. 不同的二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 通过举例子发现重叠子问题 代码很简单&#xff0c;主要是思路问题&#xff0…

AD使用问题

设计流程&#xff1a; 1.先创建项目——添加原理图&#xff0c;原理图库&#xff0c;PCB&#xff0c;PCB库 2.画原理图库和封装库 主要有三种方法&#xff1a; &#xff08;1&#xff09;手动画库和封装&#xff0c;常常用于嘉立创查询不到的器件 &#xff08;2&#xff0…

spark的简单学习二

一 spark sql基础 1.1 Dataframe 1.介绍&#xff1a; DataFrame也是一个分布式数据容器。然而DataFrame更像传统数据库的二维表 格&#xff0c;除了数据以外&#xff0c;还掌握数据的结构信息&#xff0c;即schema。同时&#xff0c;与Hive类似&#xff0c;DataFrame也支 持…

6、xss-labs之level8

1、测试分析 传入123查看页面源码&#xff0c;发现传入的值传给了value和a标签的href&#xff0c;并且对特殊字符<>" 都进行了HTML实体化&#xff0c;对于大小写进行了转化&#xff0c;过滤掉了src、data、onfocus、href、script、"&#xff08;双引号&#…

边缘计算网关的主要功能有哪些?天拓四方

随着物联网&#xff08;IoT&#xff09;的快速发展和普及&#xff0c;边缘计算网关已经成为了数据处理和传输的重要枢纽。作为一种集成数据采集、协议转换、数据处理、数据聚合和远程控制等多种功能的设备&#xff0c;边缘计算网关在降低网络延迟、提高数据处理效率以及减轻云数…

Discourse 编辑没有办法显示更多的 JS 错误

Priority/Severity: High Platform: 3.3.0.beta3-dev UI bugs Description: 昨天升级的时到最新版本的时候就发现有这个错误&#xff0c;是 JS 的错误。 发了一个帖子到官方的网站上&#xff0c;官方说可能是插件的问题。 但是我们实在是没有安装什么插件呀&#xff1f; 官方…

Beego 使用教程 8:Session 和 Cookie

beego 是一个用于Go编程语言的开源、高性能的 web 框架 beego 被用于在Go语言中企业应用程序的快速开发&#xff0c;包括RESTful API、web应用程序和后端服务。它的灵感来源于Tornado&#xff0c; Sinatra 和 Flask beego 官网&#xff1a;http://beego.gocn.vip/ 上面的 be…

地下18米的科技守护:旗晟综合管廊巡检机器人

近日&#xff0c;安徽某业主的地下18米深的地下管廊处&#xff0c;一种先进的巡检机器人正活跃在管廊轨道上&#xff0c;执行着重要的巡检任务&#xff0c;只见机器人在管廊轨道上平稳前行&#xff0c;它搭载着先进的检测设备&#xff0c;对地下管廊内的各种设施进行监测巡检&a…

养猫久了才知道,为什么宠物空气净化器是养猫必备!效果惊人!

养猫是一件非常愉快的事情&#xff0c;猫咪的陪伴能带给我们无尽的欢乐和温暖。然而&#xff0c;随着时间的推移&#xff0c;许多养猫的朋友会发现一个问题&#xff0c;那就是家中的空气质量变差了&#xff0c;猫毛、异味等问题也随之而来。这时候&#xff0c;一款好的宠物空气…

【Python】 Python中的“命名元组”:简单而强大的数据结构

基本原理 在Python中&#xff0c;namedtuple是tuple的一个子类&#xff0c;它允许我们为元组的每个位置指定一个名字。这种数据结构非常适合用于需要固定字段和值的场景&#xff0c;例如数据库查询的结果或配置文件中的设置。 namedtuple提供了一种方便的方式来访问元组中的元…

mysql中单表查询的成本

大家好。我们知道MySQL在执行一个查询时&#xff0c;经常会有多个执行方案&#xff0c;然后从中选取成本最低或者说代价最低的方案去真正的执行查询。今天我们来聊一聊单表查询的成本。 那么到底什么是成本呢&#xff1f;这里我们说的成本或者代价是由两方面组成的&#xff1a…

Android性能优化方案

1.启动优化&#xff1a; application中不要做大量耗时操作,如果必须的话&#xff0c;建议异步做耗时操作2.布局优化&#xff1a;使用合理的控件选择&#xff0c;少嵌套。&#xff08;合理使用include,merge,viewStub等使用&#xff09;3.apk优化&#xff08;资源文件优化&#…

opencv c++编程基础

1、图片的本质 图像在 OpenCV 中的本质 在 OpenCV 中&#xff0c;图像被表示为一个多维数组&#xff0c;其中每个元素对应于图像中的单个像素。图像的维度取决于其通道数和像素数。 **通道数&#xff1a;**图像可以有多个通道&#xff0c;每个通道存储图像的不同信息。例如&…

大学生选择算法向还是嵌入式向?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 由于嵌入式的薪资待遇和…

【oracle】Oracle RAC中的GNS到底是什么?

本文为云贝教育 刘峰 原创&#xff0c;请尊重知识产权&#xff0c;转发请注明出处&#xff0c;不接受任何抄袭、演绎和未经注明出处的转载 一、概述 Oracle Grid Naming Service (GNS) 是Oracle Grid Infrastructure的一个重要组件&#xff0c;它提供了一种集中式的命名服务&…

33 mid 55. 跳跃游戏

贪心算法&#xff1a; class Solution {public boolean canJump(int[] nums) {int leftBorder 0;for (int i 0; i <nums.length; i) {if(i<leftBorder){leftBorderMath.max(leftBorder,inums[i]);}if(leftBorder>nums.length-1){return true;}}return false;} }

元宇宙vr科普馆场景制作引领行业潮流

在这个数字化高速发展的时代&#xff0c;北京3D元宇宙场景在线制作以其独特的优势&#xff0c;成为了行业内的创新引领者。它能够快速完成空间设计&#xff0c;根据您的个性化需求&#xff0c;轻松设置布局、灯光、音效以及互动元素等&#xff0c;为您打造出一个更加真实、丰富…

TCP—三次握手和四次挥手

目录 一、三次握手和四次挥手的目的 二、TCP可靠的方面 三、什么是三次握手 四、第三次握手的目的 五、什么是四次挥手 六、超时时间的目的 七、SYN包、ACK包、FIN包 八、解决丢包和乱序 九、参考资料 一、三次握手和四次挥手的目的 TCP三次握手的目的主要是为了确保两…

谷歌地图 | Google I/O ‘24 重磅发布助力企业拓展海外市场的新功能!

编者按&#xff1a;本文是 Google I/O 2024 系列的一部分&#xff0c;该系列分享了Google 年度开发者大会上最新的 Google Maps Platform 新闻。 距全球首个 Google Maps API 问世已近 20 年。它引领了网络和移动端地理空间体验的革命。从那时起&#xff0c;Google Maps Platf…