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.hqwc.cn/news/504383.html

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

相关文章

SpringCloud微服务技术栈-什么是Docker?怎么安装Docker?

初识Docker以及常见技术及其概念概述 1、项目部署存在的问题 大型项目组件较多,运行环境也较为复杂,部署时会碰到一些问题: 依赖关系复杂,容易出现兼容性问题 开发、测试、生产环境有差异 Docker如何解决大型项目依赖关系复杂&#xff0…

MySQL进阶:视图存储过程存储函数触发器

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:MySQL进阶:大厂高频面试——各类SQL语句性能调优经验 📚订阅专栏:MySQL进阶 希望文章对你们有…

【一竞技】DOTA2-梦幻联赛S22:XG战队 2-1击败 Spirit

在3月1日晚上进行的梦幻联赛第二阶段小组赛上,XG 战队以2-1 击败Spirit战队。双方对阵第三场决胜局:XG前中期优势,冰连续控盾压制最终拿下了比赛胜利,以下是对决战报。 XG战队在天辉,阵容是小狗、火女、人马、墨客、凤凰。Spirit战队在夜魇,阵容是斯温、火枪、龙骑、白虎、飞机…

【解决(几乎)任何机器学习问题】:交叉验证

在上⼀章中,我们没有建⽴任何模型。原因很简单,在创建任何⼀种机器学习模型之前,我们必须知道什么是交叉检验,以及如何根据数据集选择最佳交叉检验数据集。 那么,什么是 交叉检验 ,我们为什么要关注它&…

手把手教你免费用Flashduty做消息通知

为什么需要消息通知? 如果有重要的情况发生,希望能通过各种媒介通知我们。可以举几个例子: 家里燃气费没有了,希望能有短信或者app通知api频繁500报错,希望及时感知,及时修复公司网站是https自签名证书&a…

Kubernetes(k8s第一部分)

这个技术一定会成为以后企业技术的标准 尙硅谷的王阳这个部分这个讲的特别好,可以自己去看 1,发展经历 阿里云iaas Infrastructure as a Service 平台及服务paas新浪云 platform as a service(号称免运维)(docker是下一代的标准&#x…

MySQL 用了哪种默认隔离级别,实现原理是什么?

MySQL 的默认隔离级别是 RR - 可重复读,可以通过命令来查看 MySQL 中的默认隔离级别。 RR - 可重复读是基于多版本并发控制(Multi-Version Concurrency Control,MVCC )实现的。MVCC,在读取数据时通过一种类似快照的方…

自测-3 数组元素循环右移问题

文章预览: 题目算法python代码 题目 算法 解题思路:这种循环题有一个经典的O(N)解法,就是前后对称交换,举例,我要循环右移 123456 的后俩个,我们的算法是将56,变成65,把前面的1234变成4321,然后…

YOLOV8介绍

原文链接: 1、 详解YOLOv8网络结构/环境搭建/数据集获取/训练/推理/验证/导出 2、Yolov8的详解与实战 3、YOLOV8模型训练部署(实战)()有具体部署和训练实现代码YOLOV8模型训练部署(实战)&…

​魏牌高山 MPV,实用「出」价值

最近车圈里的消息不少,不是高合汽车摇摇欲坠,就是苹果停止造车,亦或是小米汽车遭到吉利围攻。 令人唏嘘的同时,也不难发现,现在的新能源汽车市场,完全一副风雨欲来的景象。 没错,新能源汽车市…

罐头鱼AI传单功能操作说明|二次剪辑创作|AI智剪|批量剪辑视频

罐头鱼AI传单功能操作说明 1. 首页显示 账号登录状态 可绑定账号数量 已绑定账号数量 已绑定账号显示 显示最近上传视频素材 显示新上传素材列表 QQ:290615413 2. 抖音账号绑定功能 显示登录账号 已绑定账号 可绑定账号数量 可授权绑定抖音账号 3. 账号管理列表 显…

《PyTorch深度学习实践》第十二讲循环神经网络基础

一、RNN简介 1、RNN网络最大的特点就是可以处理序列特征,就是我们的一组动态特征。比如,我们可以通过将前三天每天的特征(是否下雨,是否有太阳等)输入到网络,从而来预测第四天的天气。 我们可以看RN…