spring security登录认证授权

spring security登录认证授权

是什么

Spring Security 主要实现了Authentication(认证,解决who are you? ) 和 Access Control(访问控制,也就是what are you allowed to do?,也称为Authorization)。Spring Security在架构上将认证与授权分离,并提供了扩展点

使用-1 快速开始 引入依赖,出现登录页面
<!-- 实现对 Spring MVC 的自动化配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 实现对 Spring Security 的自动化配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>

在这里插入图片描述

自定义登录的用户名密码(练手)

配置类继承适配器 WebSecurityConfigurerAdapter, 重写configure方法,实现UserDetailsService接口,设置用户名,密码
在这里插入图片描述

从数据库读取密码

配置类继承适配器 WebSecurityConfigurerAdapter, 重写configure方法,实现UserDetailsService接口,调用UserDetailsService的已有的实现类,或者调用自定义的类,实现了UserDetailsService实现类接口,重写loadUserByUsername方法(数据库查登录的用户名密码)
在这里插入图片描述
在这里插入图片描述

认证逻辑

认证逻辑:SecurityContextPersistenceFilter Security上下文持久化过滤器拿到登录信息,生成session存储 ->SecurityContextHolderStrategy 策略 ->ThreadLocalSecurityContextHolderStrategy 用的ThreadLocal
AbstractAuthenticationProcessingFilter 的 doFilter方法->attemptAuthentication方法->AuthenticationManager接口的authenticate接口方法
->retrieveUser->getUserDetailsService().loadUserByUsername(获取到自定义的数据库获取用户名密码方法)–>authenticate方法中 调用additionalAuthenticationChecks
检查用户名密码的准确性–>正确的话就走认证成功的逻辑,认证成功后 ->SecurityContextHolder.getContext().setAuthentication设置登录信息到上下文;错误就走认真失败的逻辑

自定义认证成功失败的处理

在这里插入图片描述
](https://img-blog.csdnimg.cn/direct/7a9f49e75ae34c599bed5ed3ff7298c3.png)

在这里插入图片描述

自定义登录成功失败逻辑(执行方法步骤)原理:
认证成功后: successForwardUrl–>ForwardAuthenticationSuccessHandler->调用了AuthenticationSuccessHandler 的onAuthenticationSuccess 方法
因此可以实现AuthenticationSuccessHandler接口,重写 onAuthenticationSuccess 方法
认证失败同理:failureForwardUrl->ForwardAuthenticationFailureHandler->调用了 ForwardAuthenticationFailureHandler的 onAuthenticationFailure 方法
因此可以实现 ForwardAuthenticationFailureHandler接口,重写 onAuthenticationFailure 方法

会话管理(session)

是什么?http请求是无状态的,因此需要在浏览器和服务器端存储状态,即会话。
tomcat 会生成session对象,响应的时候会带给客户端存到浏览器的Cookie中,
下次再请求服务器时,带上JSESSIONID,和服务器的JSESSIONID比对,相同的话响应,否则不响应

原理 :SecurityContextHolder.getContext().getAuthentication()可以获取到登录信息,因为登录的认证信息存在 SecurityContext上下文中
AbstractAuthenticationProcessingFilter 的 doFilter方法 -> successfulAuthentication 认证成功后 ->SecurityContextHolder.getContext().setAuthentication 登录的认证信息存在 SecurityContext上下文中

会话并发控制-spring security实现

同一个账号只能同时登录一次(后面登录人把前面登录人挤掉)—>可以用redis实现,此处是用spring security实现
http.sessionManagement().maximumSessions(1)
原理:AbstractAuthenticationProcessingFilter -> sessionStrategy.onAuthentication()-> ConcurrentSessionControlAuthenticationStrategy 的onAuthentication方法比较当前登录的session个数是否小于我们自己设置 -> 是的话就session 设置过期- >ConcurrentSessionFilter 并发session过滤器 -> doFilter方法 -> 没有过期则登录成功,否则走session过期策略
可自定义实现SessionInformationExpiredStrategy接口重写onExpiredSessionDetected方法
问题:http.sessionManagement().maximumSessions(1).maxSessionsPreventsLogin(true) //超过最大的登录数,阻止登录
问题:我们在yml配置的http session设置的超时时间和内部SessionInformation 是重新的一个session,超时时间和之前不同,导致http session设置的超时时间超时了,但是SessionInformation 没超时会报多人同时登录的错误最好不要用,可以用redis实现

会话并发控制-redis实现

实现原理:引入的spring session包中有个session仓库的过滤器 SessionRepositoryFilter -> doFilter方法 ->commitSession ->sessionRepository.save(session)实现了重写了RedisSessionRepository中save 方法,把session存到redis中

1.引入spring session依赖

<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.1.0</version>
</dependency>

2.修改application.yml

xmlsession:store-type: redisredis:host: localhostport: 6379

3.开启多个项目实例即可测试

Remember me实现

设置数据源,Spring Security会自动把用户信息存储到数据源中,下次登录直接比对数据库值就ok
原理:RememberMeAuthenticationFilter -> doFilter方法 -> autoLogin ->AbstractRememberMeServices的autoLogin ->PersistentTokenBasedRememberMeServices 的processAutoLoginCookie 取出remember-me的值拆分为series和token 去数据库根据series找到记录,看token是否一致一致就调用 getUserDetailsService().loadUserByUsername方法,实现自动登录
在这里插入图片描述
在这里插入图片描述

退出登录

原理:LogoutFilter-> doFilter方法 -> SecurityContextLogoutHandler的logout方法,setAuthentication为null清除认证状态,销毁HTTPSession对象
SimpleUrlLogoutSuccessHandler的onLogoutSuccess 重定向到登录页面

csrf跨站请求伪造

从 Spring Security4开始CSRF防护默认开启,默认会拦截请求,进行CSRF处理。CSRF为了保证不是其他第三方网站访问,要求访问时携带参数名为 _csrf 值为token(token 在服务端产生,在渲染请求页面时埋入页面)的内容,如果token和服务端的token匹配成功,则正常访问。
原理:CsrfFilter -> doFilter方法 -> 如果没有token 先生成一个,然后放到填充到CSRF_TOKEN中返回给页面,会再走一遍doFilter方法去比对CSRF_TOKEN和服务端的token是否能匹配成功,成功则可以访问,否则不能访问
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

授权

这里是引用访问控制url的匹配
antMatchers ant 表达式,统配符 ? 匹配任何单字符,* 匹配0或者任意数量的字符, ** 匹配0或者更多的目录
hasAuthority 有…的角色权限
hasAnyAuthority 有多个角色权限,符合一个即可
自定义403处理方案
使用 Spring Security 时经常会看见 403(无权限)。Spring Security 支持自定义权限受限处理,需要
实现 AccessDeniedHandler接口
基于方法的授权
1.JSR250注解,可以定义在方法和类上面
配置类开启@EnableGlobalMethodSecurity(jsr250Enabled = true,securedEnabled = true,prePostEnabled = true)
@RolesAllowed 访问对应方法时所应该具有的角色
@PermitAll 不进行权限控制
@DenyAll 无论什么角色都不能访问
2.@Secured注解专门用于判断是否具有角色的,能写在方法或类上。参数要以 ROLE_开头
配置类开启@EnableGlobalMethodSecurity(jsr250Enabled = true,securedEnabled = true,prePostEnabled = true)
3.支持表达式注解
配置类开启@EnableGlobalMethodSecurity(jsr250Enabled = true,securedEnabled = true,prePostEnabled = true)
使用@PreAuthorize和@PostAuthorize 在方法之前,之后进行访问控制

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

授权原理:FilterSecurityInterceptor -> doFilter方法 -> invoke-> beforeInvocation -> attemptAuthorization -> decide(AffirmativeBased) -> vote 投票是否通过授权通过则可以访问资源,失败则跳转到登录页面认证

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

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

相关文章

C语言扫雷游戏完整实现(下)

文章目录 前言一、排雷函数菜单二、排雷函数菜单的实现三、拓展棋盘功能四、源码1. test.c源文件2. game.h头文件3. game.c源文件 总结 前言 C语言实现扫雷游戏的排雷菜单&#xff0c;以及功能的实现&#xff0c;拓展棋盘功能&#xff0c;以及源码等。 上半部分的链接地址: C语…

python 笔记ast.literal_eval

1 介绍 ast.literal_eval 是 Python 标准库 ast 模块中的一个函数&#xff0c;用于安全地评估表示 Python 字面量或容器&#xff08;如列表、字典、元组、集合&#xff09;的字符串 import ast # 解析并执行一个数字表达式 num ast.literal_eval("3.14") prin…

新媒体运营-----短视频运营-----PR视频剪辑----软件基础

新媒体运营-----短视频运营-----PR视频剪辑-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/138079659 文章目录 1.1 PR软件重置与初始化设置1.2 新建项目及序列设置1.3 PR工作区的管理方法1.4 导入4K超高清视频并与ME配合工作1…

远程监控与控制的融合:吊车远程视频监控与远程开机的实现

随着信息技术的飞速发展&#xff0c;远程控制技术已经广泛应用于各个领域&#xff0c;包括工业、医疗、教育等。吊车远程视频监控作为远程控制的一种具体应用&#xff0c;不仅实现了对吊车操作的实时监控&#xff0c;还通过与远程开机功能的结合&#xff0c;进一步提升了远程控…

ctfshow web41-web50

web41 代码审计 <?php if(isset($_POST[c])){$c $_POST[c]; if(!preg_match(/[0-9]|[a-z]|\^|\|\~|\$|\[|\]|\{|\}|\&|\-/i, $c)){eval("echo($c);");} }else{highlight_file(__FILE__); } ?> 过滤了&#xff1a;[0-9] [a-z] ^ ~ $ [ ] { } & -…

Python自动化系统6

元素的特征:根据页面设计规则&#xff0c;有些特征是唯一 开发遵循了这个规则 id :类比身份证号―仅限于当前页面 username username 注意:如果id 不是固定的话&#xff0c;就不能使用来定位! xpath: 1、绝对路径&#xff1a;/html/body/div/div/div[1]/a/b --根节点&#xff…

初始Maven

1.背景 问题引入&#xff1a;为什么要使用 Maven&#xff1f; 1.1 添加第三方 jar 包 在 JavaEE 开发领域&#xff0c;有大量的第三方框架和工具可以供我们使用。使用这些 jar 包最简单的方法就是复制粘贴到 WEB-INF 目录中的 lib 目录下。但是会导致每次创建一个新工程就需要将…

基于python+django+mysql农业生产可视化系统

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…

数据结构系列-堆排序当中的T-TOK问题

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 之前我们讲到了堆排序的实现逻辑&#xff0c;那么接下来我们重点关注的就是其中的T-TOK问题 T-TOK说简单点&#xff0c;就是说&#xff0c;假如有10000个数据&#xff08;随机的…

Vue3后台管理系统推荐

目录 项目概述 &#x1f35f; 项目展示 功能特点 &#x1f957; 结语 &#x1f4a8; 项目概述 &#x1f35f; 基于Vue 3框架与Element-Plus UI组件库技术精心构建的后端管理模板。该模板系统已成功实现一个基础的权限管理模块&#xff0c;宗旨在于为追求高效二次开发的开发…

hsql数据库(HyperSQL )(简单了解一下)

文章目录 一、HyperSQL &#xff08;HSQLDB&#xff09;1、HSQLDB是什么2、安装事务提一嘴特点看官网Datagrip连接HSQLDBMaven地址使用场景 参考文章 一、HyperSQL &#xff08;HSQLDB&#xff09; 1、HSQLDB是什么 HSQLDB (Hyper SQL Database)是一个用Java编写的关系数据库管…

SpringBoot---------整合Mybatisplus

快速入门 第一步&#xff1a;导入依赖 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.1</version></dependency> 第二步&#xff1a;编写mapper…

【C++题解】1632. 需要几辆车

问题&#xff1a;1632. 需要几辆车 类型&#xff1a;分支 题目描述&#xff1a; 学校有 n 位同学要外出旅游&#xff0c;一辆大巴车可以坐 30 人&#xff0c;请问需要几辆大巴车&#xff1f; 输入&#xff1a; 一个整数 n&#xff0c;代表同学的总人数。 输出&#xff1a;…

明日方舟游戏助手:一键完成日常任务 | 开源日报 No.233

MaaAssistantArknights/MaaAssistantArknights Stars: 11.6k License: AGPL-3.0 MaaAssistantArknights 是一款《明日方舟》游戏的小助手&#xff0c;基于图像识别技术&#xff0c;支持一键完成全部日常任务。 刷理智、掉落识别及上传企鹅物流智能基建换班、自动计算干员效率…

STM32 串口打印乱码(Cubemx)

STM32 串口打印乱码&#xff08;Cubemx&#xff09; 时钟配置错误&#xff0c;CubeMX默认的外部晶振是25MHz&#xff0c;而板载的晶振为8MHzSTM32F407修改程序将外部25M晶振修改为8M&#xff08;标准库、HAL库&#xff09; 核心问题 芯片型号与晶振配置&#xff1a;使用的ST…

网络安全-Diffie Hellman密钥协商

密钥协商是保密通信双方&#xff08;或更多方&#xff09;通过公开信道来共同形成密钥的过程。一个密钥协商方案中&#xff0c;密钥的值是某个函数值&#xff0c;其输入量由两个成员&#xff08;或更多方&#xff09;来提供。密钥协商的记过是参与协商的双方&#xff08;或更多…

【linux】Linux第一个小程序-进度条

1. 预备知识&#xff1a;回车和换行 回车&#xff08;Carriage Return&#xff0c;CR&#xff09;&#xff1a; 在早期的机械打字机中&#xff0c;回车指的是将打字机的打印头移回到行首的操作&#xff0c;这样打印头就可以开始新的一行的打印。在ASCII编码中&#xff0c;回车用…

AIGC-stable-diffusion(文本生成图片)+PaddleHub/HuggingFace

功能 stable-diffusion(文本生成图片)PaddleHub&#xff0c;HuggingFace两种调用方式 PaddleHub 环境 pip install paddlepaddle-gpu pip install paddlehub 代码 from PIL import Image import paddlehub as hub module hub.Module(namestable_diffusion)## 保存在demo…

NXP恩智浦 S32G电源管理芯片 VR5510 安全概念 Safety Concept (万字长文详解,配21张彩图)

NXP恩智浦 S32G电源管理芯片 VR5510 安全概念 Safety Concept (万字长文详解&#xff0c;配21张彩图) 1. 简介 本应用笔记描述了与S32G处理器和VR5510 PMIC相关的安全概念。该文档涵盖了S32G和VR5510的安全功能以及它们如何相互作用&#xff0c;以确保对ASIL D安全完整性级别…

STM32,复位和时钟控制

外部时钟 HSE 以后需要用到什么就这样直接拿去配就行了