spring security登录认证授权

news2024/10/6 6:41:57

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

xml
 session:
    store-type: redis
  redis:
    host: localhost
    port: 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 在方法之前,之后进行访问控制

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

在这里插入图片描述

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

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

相关文章

基于ssm汽车租赁系统业务管理子系统论文

系统简介 随着信息互联网购物的飞速发展&#xff0c;一般企业都去创建属于自己的管理系统。本文介绍了汽车租赁系统业务管理子系统的开发全过程。通过分析企业对于汽车租赁系统业务管理子系统的需求&#xff0c;创建了一个计算机管理汽车租赁系统业务管理子系统的方案。文章介…

【MySQL 数据宝典】【内存结构】- 005 Log Buffer

Log Buffer Log Buffer&#xff1a;日志缓冲区&#xff0c;用来保存要写入磁盘上log文件&#xff08;Redo/Undo&#xff09;的数据&#xff0c;日志缓冲区的内容定期刷新到磁盘log文件中。日志缓冲区满时会自动将其刷新到磁盘&#xff0c;当遇到BLOB或多行更新的大事务操作时&…

【智能排班系统】Quartz结合Cron-Utils自定义时间发送上班、休息提醒

文章目录 Quartz&#xff1a;强大的Java作业调度引擎Quartz概述核心概念与架构配置文件主配置&#xff08;配置主要调度器设置、事务&#xff09;线程池配置&#xff08;调整作业执行资源&#xff09;SimpleThreadPool特定属性自定义线程池 RAMJobStore配置&#xff08;在内存中…

C# 窗体应用程序 Chart控件显示实时曲线

IDE: VS2019 项目模板&#xff1a;C# windows 窗体应用(.NET Framework) 【参考】 B站上教程C#Chart控件画折线图的使用&#xff0c;关于Chart控件的属性&#xff0c;介绍得非常详细。B站上教程C#上位机Chart控件实时曲线终极讲解&#xff0c;对鼠标滚轮事件等&#xff0c;多…

NLP任务全览:涵盖各类NLP自然语言处理任务及其面临的挑战

自然语言处理(Natural Language Processing, 简称NLP&#xff09;是计算机科学与语言学中关注于计算机与人类语言间转换的领域。NLP将非结构化文本数据转换为有意义的见解&#xff0c;促进人与机器之间的无缝通信&#xff0c;使计算机能够理解、解释和生成人类语言。人类等主要…

基于SkyEye运行Qt:著名应用程序开发框架

Qt是一个著名的跨平台的C图形用户界面应用程序开发框架&#xff0c;目前包括Qt Creator、Qt Designer等等快速开发工具&#xff0c;还支持2D/3D图形渲染、OpenGL&#xff0c;允许真正的组件编程&#xff0c;是与GTK、MFC、OWL、ATL一样的图形界面库。使用Qt开发的软件可以做到一…

excel 无法正确处理 1900-03-01 前的日期

问题由来&#xff1a;excel 用公式 TEXT(A1,"yyyy-mm-dd") 转日期时&#xff0c;当A1 的值等于59 的时候&#xff0c;返回值是1900-02-28&#xff1b;当A1 的值等于61 的时候&#xff0c;返回值是1900-03-01&#xff1b;那么当 A1的值为 60 的时候&#xff0c;返回值…

[大模型]MiniCPM-2B-chat WebDemo部署

MiniCPM-2B-chat WebDemo部署 MiniCPM-2B-chat 介绍 MiniCPM 是面壁智能与清华大学自然语言处理实验室共同开源的系列端侧大模型&#xff0c;主体语言模型 MiniCPM-2B 仅有 24亿&#xff08;2.4B&#xff09;的非词嵌入参数量。 经过 SFT 后&#xff0c;MiniCPM 在公开综合性…

开发与产品的战争之自动播放视频

开发与产品的战争之自动播放视频 起因 产品提了个需求&#xff0c;对于网站上的宣传视频&#xff0c;进入页面就自动播放。但是基于我对chromium内核的一些浅薄了解&#xff0c;我当时就给拒绝了: “浏览器不允许”。&#xff08;后续我们浏览器默认都是chromium内核的&#…

C盘越用越大?教你如何科学管理C盘空间

前言&#xff1a; 如图&#xff0c;左边是我多开的E5电脑&#xff0c;装的是LTSC2019_210707F多开封装版&#xff0c;C盘占用8.5GB&#xff0c;右边是我平常打游戏写代码的电脑&#xff0c;装的是Win11 22H2&#xff0c;C盘占用30GB。两台电脑都关闭了休眠&#xff0c;C盘的虚拟…

【鸿蒙开发】画布组件 Canvas

1. Canvas 提供画布组件&#xff0c;用于自定义绘制图形。 接口&#xff1a; Canvas(context?: CanvasRenderingContext2D) 参数&#xff1a; 参数名 参数类型 必填 默认值 参数描述 context CanvasRenderingContext2D 否 - 不支持多个Canvas共用一个CanvasRende…

GPT国内怎么用

2022年11月&#xff0c;OpenAI发布了ChatGPT&#xff0c;这标志着大型语言模型在自然语言处理领域迈出了巨大的一步。ChatGPT不仅在生成文本方面表现出了惊人的流畅度和连贯性&#xff0c;更为人工智能应用开启了全新的可能性。 ChatGPT的推出促进了人工智能技术在多个领域的广…

查看apk是64位32位(三种方法)

通过检查APK文件&#xff0c;你可以确定该APK支持的架构类型&#xff0c;包括它是为64位&#xff08;例如arm64-v8a、x86_64&#xff09;还是32位&#xff08;例如armeabi-v7a、x86&#xff09;架构准备的。Android应用程序可以包含多个不同的二进制文件&#xff0c;每个文件针…

数组和指针的联系(C语言)

数组和指针是两种不同的数据类型&#xff0c;数组是一种构造类型&#xff0c;用于存储一组相同类型的变量&#xff1b;而指针是一种特殊类型&#xff0c;专门用来存放数据的地址。数组名除了sizeof(数组名)和&数组名表示整个数组外&#xff0c;其他情况下都表示的是首元素的…

说说你对图的理解?相关操作有哪些?

一、是什么 在计算机科学中&#xff0c;图是一种抽象的数据类型&#xff0c;在图中的数据元素通常称为结点&#xff0c;V是所有顶点的集合&#xff0c;E是所有边的集合 如果两个顶点v,w&#xff0c;只能由v向w&#xff0c;而不能由w向v&#xff0c;那么我们就把这种情况叫做一…

Leetcode - 周赛393

目录 一&#xff0c;3114. 替换字符可以得到的最晚时间 二&#xff0c;3115. 素数的最大距离 三&#xff0c;3116. 单面值组合的第 K 小金额 四&#xff0c; 3117. 划分数组得到最小的值之和 一&#xff0c;3114. 替换字符可以得到的最晚时间 本题是一道模拟题&#xff0c;…

有效的括号 + 点击消除 || 匹配问题

目录 点击消除&#xff1a; 有效的括号&#xff1a; 点击消除&#xff1a; 点击消除_牛客题霸_牛客网 (nowcoder.com)https://www.nowcoder.com/practice/8d3643ec29654cf8908b5cf3a0479fd5?tpId308&tqId40462&ru/exam/oj 如题目所述&#xff0c; 示例1&#xf…

顺丰同城急送API对接(附源码)

一、背景 最近公司让我对接顺丰同城急送的API&#xff0c;讲讲里面需要注意的几点 官方的API文档有些示例代码也不全&#xff0c;具体细节不多说&#xff0c;如果你现在也需要对接他们API&#xff0c;可以参考本篇博客再配合官方文档结合起来看&#xff0c;可以让您再开发的时…

C++面向对象程序设计-北京大学-郭炜【课程笔记(七)】

C面向对象程序设计-北京大学-郭炜【课程笔记&#xff08;七&#xff09;】 1、类型转换运算符2、自增、自减运算符的重载3、继承和派生的基本概念3.1、基本概念3.2、派生类对象的内存空间 4、继承关系和复合关系4.1、继承关系的使用4.2、复合关系的使用 5、派生类覆盖基类成员6…

【分治】Leetcode 数组中的第K个最大元素

题目讲解 数组中的第K个最大元素 算法讲解 堆排序&#xff1a;1. 寻找最后一个节点的父亲&#xff0c;依次向上遍历&#xff0c;完成小堆的建立&#xff1b;2. 从最后一个元素开始&#xff0c;和堆顶的数据做交换&#xff0c;此时最小的数据在对后面&#xff0c;然后对剩下的…