spring-security 项目实战(一)个人健康档案

spring-security 项目实战(一)个人健康档案

  • 项目说明
    • 项目地址
    • 框架信息
  • 代码分析
    • 配置类解析
    • 默认登录页登录接口执行逻辑
    • 登录认证成功之后重定向到main页面过程
      • 未登录之前访问 /main
      • 生成默认登录页
      • 点击登录
    • 登录之后访问 /main
      • 执行流程
      • 清空认证信息

项目来源于《Spring Security原理与实战》,这本书对spring security介绍比较详细的,很多原理性的内容讲解的比较清晰。

项目说明

项目地址

https://gitee.com/3281328128/spring-security-basic
master 分支的代码原来书里面的代码,boot_3.2.2 分支是修改之后的代码。项目来源于书籍的第5章-实现自定义的用户认证体系,原来的项目用的spring security版本比较低,改成了 spring-security-6.2.1 版本的,该项目前后端不分离的,基于 session 来认证用户是否登录

框架信息

boot_3.2.2 分支使用的框架信息

名称版本信息说明
JDK17LTS 长期支持版本
spring-boot-starter-web3.2.2内嵌web服务器, jar包启动
spring-boot-starter-security3.2.2安全框架
mybatis-plus-spring-boot3-starter3.5.5ORM框架
mybatis-plus-generator3.5.5根据数据表自动生成代码
spring-boot-starter-thymeleaf3.2.2处理静态资源,模板数据填充

代码分析

启动项目之后,访问 http://localhost:8080/main地址,会重定向到默认登录页, 登录认证之后会重定向到main页面
在这里插入图片描述
重定向到默认页面的过程可以查看之前的博客spring-security 默认登录页面(一)。整个过程还有几个问题需要分析

  1. 默认登录页登录接口的执行逻辑
  2. 登录认证成功之后重定向到main页面过程

配置类解析

配置类代码如下

package com.lagou.springsecurity.config;import com.lagou.springsecurity.service.AuthenticationProviderService;
import com.lagou.springsecurity.service.CustomUserDetailsService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;import org.springframework.security.web.SecurityFilterChain;@Configuration
public class SecurityConfig {private AuthenticationProviderService authenticationProvider;private CustomUserDetailsService customUserDetailsService;public SecurityConfig(AuthenticationProviderService authenticationProvider,CustomUserDetailsService customUserDetailsService) {this.authenticationProvider = authenticationProvider;this.customUserDetailsService = customUserDetailsService;}@Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.formLogin(httpSecurityFormLoginConfigurer ->httpSecurityFormLoginConfigurer.defaultSuccessUrl("/main", true));http.authorizeHttpRequests((authorizeHttpRequests) ->authorizeHttpRequests.anyRequest().authenticated());http.authenticationProvider(authenticationProvider);http.userDetailsService(customUserDetailsService);return http.build();}
}
  1. http.formLogin(httpSecurityFormLoginConfigurer -> httpSecurityFormLoginConfigurer.defaultSuccessUrl("/main", true)); 配置登录成功之后的跳转页面,本章后续会分析这个过程
  2. http.authorizeHttpRequests((authorizeHttpRequests) -> authorizeHttpRequests.anyRequest().authenticated()); 配置所有的地址都需要认证,这个配置会在AuthorizationFilter 中读取到,与当前的用户权限对比,看能否访问对应的资源,如果不能抛出异常给ExceptionTranslationFilter 过滤器处理
  3. http.authenticationProvider(authenticationProvider) 配置自定义的登录验证处理逻辑,验证用户名、密码,设置用户权限等
  4. http.userDetailsService(customUserDetailsService) 配置自定义的用户信息接口,根据用户名加载用户信息

默认登录页登录接口执行逻辑

  1. org.springframework.security.web.FilterChainProxy.VirtualFilterChain#doFilter 方法中增加断点,方便调试每个过滤器
    在这里插入图片描述
    可以看到当前项目配置的过滤器详情
    在这里插入图片描述

登录认证成功之后重定向到main页面过程

未登录之前访问 /main

  1. org.springframework.security.web.savedrequest.RequestCacheAwareFilter 过滤器会将请求缓存
  2. org.springframework.security.web.access.intercept.AuthorizationFilter 过滤去认证抛出异常
    在这里插入图片描述
  3. 异常处理过滤器 org.springframework.security.web.access.ExceptionTranslationFilter 处理异常
    在这里插入图片描述
    在这里插入图片描述
    生成重定向url http://localhost:8080/login
    在这里插入图片描述

生成默认登录页

https://blog.csdn.net/modelmd/article/details/135982664
在这里插入图片描述

点击登录

点击登录会调用 /login 接口,在 org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter 中进行用户名、密码的验证,UsernamePasswordAuthenticationFilter extends AbstractAuthenticationProcessingFilter,大多数处理流程在 AbstractAuthenticationProcessingFilter中执行
在这里插入图片描述
流程图如下

Created with Raphaël 2.3.0 开始 用户名、密码认证 判断请求地址是否需要认证? 执行认证流程 用户名密码校验成功? 修改会话ID、CSRF token 设置认证成功,重定向到登录成功页 执行结束 return ; 结束 yes no yes no
  1. 用户名密码校验详细过程解析
    在方法 org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter#attemptAuthentication 执行用户认证的逻辑
    在这里插入图片描述
    从请求头中获取用户名、密码
    在这里插入图片描述
    AuthenticationManager 类负责执行用户认证的逻辑,具体实现逻辑在类 org.springframework.security.authentication.ProviderManager
    在这里插入图片描述
    核心认证逻辑方法org.springframework.security.authentication.ProviderManager#authenticate
    在这里插入图片描述
    最终会进入用户自定义的用户名密码逻辑,在认证方法中可以将用户的权限加载到认证对象,这样AuthorizationFilter 就可以验证用户否有权限访问对应的url
    在这里插入图片描述
    在这里插入图片描述

  2. 修改会话ID、CSRF token
    在这里插入图片描述
    org.springframework.security.web.authentication.session.ChangeSessionIdAuthenticationStrategy修改请求的 sessionId, 防止固定会话攻击,org.springframework.security.web.csrf.CsrfAuthenticationStrategy更新seesion对应的 CSRF token

  3. 设置认证成功,重定向到登录成功页
    org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter#successfulAuthentication方法执行认证成功之后的相关逻辑。安全上下文SecurityContext设置认证成功的对象,安全上下文基于ThreadLocal实现的,在同一线程的其它filter中可以比较容易获取到认证成功的对象数据
    在这里插入图片描述
    SecurityContext中设置上下文对象之后,也会在 httpSeesion、httpRequest属性中存储认证对象,可以查看 org.springframework.security.web.context.SecurityContextRepository#saveContext方法。HttpSessionSecurityContextRepository将认证对象存储在 seesion ,RequestAttributeSecurityContextRepository将认证对象存储在http请求头属性
    在这里插入图片描述
    存储在 session的 key 默认值是 SPRING_SECURITY_CONTEXT
    在这里插入图片描述
    存储在 httpRequest 属性中的 key 默认值是 org.springframework.security.web.context.RequestAttributeSecurityContextRepository.SPRING_SECURITY_CONTEXT
    在这里插入图片描述
    重定向到缓存页。首先从session中获取缓存信息,然后重定向到具体的地址,可以查看org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler#onAuthenticationSuccess方法
    在这里插入图片描述
    从session缓存中获取 url
    在这里插入图片描述
    session缓存中未获取到 url, 去目标url处理器中查找 org.springframework.security.web.authentication.AbstractAuthenticationTargetUrlRequestHandler#handle
    在这里插入图片描述

AbstractAuthenticationTargetUrlRequestHandler中目标defaultTargetUrl如何初始化的?
在配置类中初始化配置登录成功的地址
在这里插入图片描述

登录之后访问 /main

执行流程

  1. AnonymousAuthenticationFilter 中设置认证对象
    在这里插入图片描述

  2. 认证过滤器AuthorizationFilter 中会获取 session 中的已认证的用户
    在这里插入图片描述
    校验用户权限 org.springframework.security.authorization.AuthenticatedAuthorizationManager#check
    在这里插入图片描述
    获取已认证用户对象,org.springframework.security.web.access.intercept.AuthorizationFilter#getAuthentication
    在这里插入图片描述
    从session 中获取认证对象 org.springframework.security.web.context.HttpSessionSecurityContextRepository#loadDeferredContext,
    org.springframework.security.web.context.HttpSessionSecurityContextRepository#readSecurityContextFromSession
    在这里插入图片描述
    在这里插入图片描述
    获取之前登录的时候设置到 session 中的用户,属性key 和之前登录一致的 SPRING_SECURITY_CONTEXT
    在这里插入图片描述

清空认证信息

如果将cookie 清除之后,页面就会重新跳转到登录页

  1. 清除 cookie,在开发者工具中,删除对应的 session
    在这里插入图片描述
  2. 访问 http://localhost:8080/main 地址,丛session中获取认证信息失败,会重定向到登录页
    在这里插入图片描述
    在这里插入图片描述

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

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

相关文章

低空经济20人|卓翼智能任雪峰:以技术驱动市场,引领无人机细分领域创新

作为国内系留无人机领域的领头羊企业,卓翼智能致力于提供智能无人系统解决方案。本期“低空经济20人”请到卓翼智能CEO任雪峰分享他对系留无人机研发应用的经验以及未来无人机行业生态发展的观点。 如今,无人机的应用场景逐渐广泛,在社会发展…

18个惊艳的可视化大屏(第20辑):物联网场景

实时监控和管理 物联网系统通常涉及大量的传感器、设备和数据,通过将这些数据可视化展示在大屏上,可以实时监控和管理物联网系统的运行状态。这有助于及时发现问题、快速响应,并提高系统的可靠性和稳定性。 数据分析和决策支持 可视化大屏可…

软件测试--性能测试实战篇

软件测试--性能测试实战篇 项目介绍和部署1. 轻商城项目介绍1.1 背景1.2 简介2. 项目功能架构3. 项目技术架构4. 熟悉数据库设计5. 轻商城项目搭建5.1 准备工作5.2 项目搭建步骤性能测试需求分析1. 性能测试需求分析1.1 如何获取有效的需求2. 性能测试点的提取2.1 性能测试点的…

第五十二回 戴宗二取公孙胜 李逵独劈罗真人-飞桨AI框架安装和使用示例

吴用说只有公孙胜可以破法术,于是宋江请戴宗和李逵去蓟州。两人听说公孙胜的师傅罗真人在九宫县二仙山讲经,于是到了二仙山,并在山下找到了公孙胜的家。 两人请公孙胜去帮助打高唐州,公孙胜说听师傅的。罗真人说出家人不管闲事&a…

SpringMVC 中的常用注解和用法

⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:JavaEE 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 注解 1. MVC定义2. 注解2.1 RequestMappin…

leetcode:LCR 006. 两数之和 II - 输入有序数组(python3解法)

难度&#xff1a;简单 给定一个已按照 升序排列 的整数数组 numbers &#xff0c;请你从数组中找出两个数满足相加之和等于目标数 target 。 函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 0 开始计数 &#xff0c;所以答案数组应当满足 0 <…

el-dialog封装组件

父页面 <template><div><el-button type"primary" click"visible true">展示弹窗</el-button><!-- 弹窗组件 --><PlayVideo v-if"visible" :visible.syncvisible /></div> </template><sc…

谷粒学院--在线教育实战项目【一】

谷粒学院--在线教育实战项目【一】 一、项目概述1.1.项目来源1.2.功能简介1.3.技术架构 二、Mybatis-Plus概述2.1.简介2.2.特性 三、Mybatis-Plus入门3.1.创建数据库3.2.创建 User 表3.3.初始化一个SpringBoot工程3.4.在Pom文件中引入SpringBoot和Mybatis-Plus相关依赖3.5.第一…

融资项目——OpenFeign的降级与熔断

当一个微服务调用其他微服务时&#xff0c;如果被调用的微服务因各种原因无法在规定时间内提供服务&#xff0c;则可以直接使用本地的服务作为备选&#xff0c;即进行降级熔断。 如之前所提到的微服务为例&#xff1a; 如果希望实现降级熔断&#xff0c;可以在本地创建一个实现…

AI改变游戏规则:内容创作的新时代!

AI技术&#xff0c;尤其是人工智能&#xff08;AI&#xff09;在内容创作领域的应用&#xff0c;正开启了一个全新的时代。这一时代的核心在于利用AI的能力&#xff0c;不仅提高内容创作的效率&#xff0c;还能引入前所未有的创新元素&#xff0c;从而彻底改变游戏规则。 AI在…

OpenCV与AI深度学习 | 基于OpenCV实现模糊检测 / 自动对焦

本文来源公众号“OpenCV与AI深度学习”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;基于OpenCV实现模糊检测 / 自动对焦 导 读 本文主要介绍使用OpenCV实现图像模糊检测/相机自动对焦功能。 前 言 为了检测图片是否对焦&…

coqui-ai/TTS 案例model文件

GitHub - coqui-ai/TTS: &#x1f438;&#x1f4ac; - a deep learning toolkit for Text-to-Speech, battle-tested in research and production Coqui AI的TTS是一款开源深度学习文本转语音工具&#xff0c;以高质量、多语言合成著称。它提供超过1100种语言的预训练模型库&…

C#,哈夫曼编码(Huffman Code)压缩(Compress )与解压缩(Decompress)算法与源代码

David A. Huffman 1 哈夫曼编码简史&#xff08;Huffman code&#xff09; 1951年&#xff0c;哈夫曼和他在MIT信息论的同学需要选择是完成学期报告还是期末考试。导师Robert M. Fano给他们的学期报告的题目是&#xff0c;寻找最有效的二进制编码。由于无法证明哪个已有编码是…

java编程的简化表达方法——Lambda表达式及方法引用概述

前言&#xff1a; 学到简化写法了&#xff0c;感觉需要对代码非常熟悉才能用得好&#xff0c;整理下写法。打好基础&#xff0c;daydayup! Lambda表达式 Lambda表达式是JDK8开始新增得一种语法形式&#xff1b;作用&#xff1a;用于简化匿名内部类的代码写法。 Lambda表达式的格…

蓝桥杯嵌入式模板构建——RCT时钟

在CubeMX里的RTC模块启用RTC时钟和日历功能 输入到RTC的时钟要配置成1HZ,这样的话RTC每经过1s走时一次 由于RTC时钟默认配置为32Khz 所以我们需要将异步分频值与同步分频值的乘积调整为32K分频即可一秒走时一次 频率&#xff1a;32000hz / 32000hz 1hz 必须是31和999&#…

阿珊详解Vue路由的两种模式:hash模式与history模式

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

计算机网络面经-HTTPS加密过程

前言 在上篇文章HTTPS详解一中&#xff0c;我已经为大家介绍了 HTTPS 的详细原理和通信流程&#xff0c;但总感觉少了点什么&#xff0c;应该是少了对安全层的针对性介绍&#xff0c;那么这篇文章就算是对HTTPS 详解一的补充吧。还记得这张图吧。 HTTPS 和 HTTP的区别 显然&am…

idea Gradle 控制台中文乱码

如下图所示&#xff0c;idea 中的 Gradle 控制台中文乱码&#xff1a; 解决方法&#xff0c;如下图所示&#xff1a; 注意&#xff1a;如果你的 idea 使用 crack 等方式破解了&#xff0c;那么你可能需要在文件 crack-2023\jetbra\vmoptions\idea.vmoptions 中进行配置&#xf…

Java引用传递及基本应用

在 Java 中&#xff0c;传递参数的方式主要有两种&#xff1a;值传递&#xff08;传递的是对象的引用值&#xff09;和引用传递。本教程将重点介绍 Java 中的引用传递以及其基本应用。 1. 引用传递概念 在 Java 中&#xff0c;所有的方法参数都是通过值传递的。对于对象类型的…

MAC 的vscode菜单栏怎么调?

我去&#xff0c;这个bug找到了半天&#xff0c;终于找到正解了&#xff0c;仅记录&#xff0c;为广大和我一样不熟悉mac的兄弟们避坑。 正解&#xff1a;mac的vscode的菜单栏在屏幕最顶上&#xff0c;不用调出来&#xff0c;人家一直都有。