Spring Security实现用户认证一:简单示例

Spring Security实现用户认证一:简单示例

  • 1 原理
    • 1.1 用户认证怎么进行和保存的?
      • 认证流程
      • SecurityContext保存
  • 2 创建简单的登录认证示例
    • 2.1 pom.xml依赖添加
    • 2.2 application.yaml配置
    • 2.3 创建WebSecurityConfig配置类
    • 2.4 测试

1 原理

Spring Security是一个Java框架,用于保护应用程序的安全性。它提供了一套全面的安全解决方案,包括身份验证、授权、防止攻击等功能。Spring Security基于过滤器链的概念,可以轻松地集成到任何基于Spring的应用程序中。它支持多种身份验证选项和授权策略,开发人员可以根据需要选择适合的方式。

在这里插入图片描述

从官方给的流程图可以看出,DelegatingFilterProxy通常被配置为一个Servlet过滤器,注册到Servlet容器中,而DelegatingFilterProxy会将过滤请求代理给FilterChainProxy

Spring Security中定义的过滤器链会被注册进入FilterChainProxyFilterChainProxy持有一个或多个SecurityFilterChain实例,每个实例包含一组过滤器和一个匹配规则(通常是一个请求模式)。

  • 当一个HTTP请求到达应用时,Servlet容器会首先调用DelegatingFilterProxy
  • DelegatingFilterProxy会将请求委托给FilterChainProxy
  • FilterChainProxy根据请求URL选择适当的过滤器链(SecurityFilterChain),并按顺序执行链中的过滤器。

1.1 用户认证怎么进行和保存的?

认证流程

在这里插入图片描述
从上面得知,Spring Security内部是由一个个过滤器组成的,那必然会经历一个认证过滤器。

  1. 负责认证的过滤器为AbstractAuthenticationProcessingFilter,其本质是一个抽象类型的过滤器,通过调用里面一个用于执行认证的抽象方法attemptAuthentication。那必然需要一个该抽象类的具体继承类去实现抽象方法attemptAuthentication,完成认证的功能。

  2. Spring Security中为其写了一个默认的继承类为UsernamePasswordAuthenticationFilter,实现了attemptAuthentication方法,将提交的usernamepassword生成UsernamePasswordAuthenticationToken

  3. UsernamePasswordAuthenticationFilter只是负责过滤采用用户名和密码认证方式的请求,生成的UsernamePasswordAuthenticationToken并没完成认证,而是用于后面选择合适的AuthenticationProvider

  4. ProviderManager类实现了AuthenticationManager接口,ProviderManager类管理一个List<AuthenticationProvider> providers,这里面存着可用的AuthenticationProviderProviderManager类通过UsernamePasswordAuthenticationToken选择合适的AuthenticationProvider进行具体的校验,如DaoAuthenticationProvider

如果认证失败:

  • SecurityContextHolder 被清空。
  • RememberMeServices.loginFail被调用(需要配置)。
  • AuthenticationFailureHandler 被调用。

认证成功:

  • SessionAuthenticationStrategy 被通知有新的登录。
  • Authentication 是在 SecurityContextHolder 上设置的。
  • RememberMeServices.loginSuccess 被调用。
  • ApplicationEventPublisher 发布一个 InteractiveAuthenticationSuccessEvent 事件。
  • AuthenticationSuccessHandler 被调用。

SecurityContext保存

在这里插入图片描述
在得到用户认证成功的UsernamePasswordAuthenticationToken,这个token包含了用户的用户名、权限和是否认证等信息,并且会写入到SecurityContext中。 默认情况下是保存在session中的,方便下次直接从session中获取(持久化)。

如上图所示,SecurityContext包含了AuthenticationAuthenticationUsernamePasswordAuthenticationTokenSecurityContext被设置在SecurityContextHolder中。
在这里插入图片描述
SecurityContextHolder用于存储和检索 SecurityContext。它是整个 Spring Security 框架中访问认证信息的核心组件。

由于在进入SecurityFilterChain后,肯定需要将 从Repository 获取已经认证的信息 放在 认证之前执行,才能实现一个持久化存储。否则每次都是从新认证。

判断用户是否认证的便是SecurityContextSecurityContextPersistenceFilter SecurityContextRepository 加载 SecurityContext 并将其设置在 SecurityContextHolder 上。没有获取到SecurityContext则未认证。

Spring Security中SecurityContextRepository的默认实现是HttpSessionSecurityContextRepository,所以为什么会将session作为默认的上下文存储地点。这样做的坏处是需要维持大量的session,加重了服务器的负担。

2 创建简单的登录认证示例

创建一个Spring Boot 的项目。

2.1 pom.xml依赖添加


<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

2.2 application.yaml配置

spring:application:name: spring-securityserver:port: 4555logging:level:web: debug

2.3 创建WebSecurityConfig配置类

package com.song.cloud.config;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.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;import static org.springframework.security.config.Customizer.withDefaults;@Configuration
@EnableWebSecurity  //开启SpringSecurity自动配置(springboot中可以省略)
public class WebSecurityConfig {@Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.authorizeRequests(authorize ->authorize.anyRequest()  //对任何请求执行认证.authenticated())// formLogin 的配置先于 httpBasic.formLogin(withDefaults())  //内置的表单认证 .httpBasic(withDefaults());  //内置的基础认证return http.build();}
}

2.4 测试

这一步便是最基本的认证配置,网页打开localhost:4555,将会自动跳转到登录页面进行认证。
在这里插入图片描述
默认的用户名为:user
默认的密码在控制台打印输出,如下。
在这里插入图片描述
登录成功的页面:
在这里插入图片描述

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

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

相关文章

【AI绘画】Stable diffusion初级教程08——提示词(prompt)该如何写

今天是一篇干货&#xff0c;干的喝水的那种…… 写之前呢&#xff0c;先给大家打个比方&#xff1a;现在刚入门学习SD的相当于刚上学的小学生&#xff0c;提示词就相当于作文&#xff0c;还是英语作文&#xff0c;如果你总是抄抄抄&#xff0c;不知道作文的要点&#xff0c;语法…

全球知名哲学家思想家颜廷利:将人生黑暗视为一种机遇

在时间的长河中&#xff0c;我们短暂的人生不过是眨眼间的光景。然而&#xff0c;正是这短暂的旅程给予了我们无限的可能性和转变的契机。我们应该勇敢地面对生活中的暗夜&#xff0c;将其视作成长的土壤&#xff0c;让自我在其中焕发出独特的光辉。 当我们在生命的历程中暂停脚…

React 状态管理库深度对比:在做技术选型的时候如何选择合适的状态库,nolan出品

掘金链接&#xff1a;https://juejin.cn/post/7368288987642232872 1,简介 在状态共享这方面&#xff0c;不像 Vuex&#xff0c;React 的官方并没有强力推荐某种封装方案&#xff0c;所以 React 的状态管理工具五花八门&#xff0c;百花齐放&#xff0c; react-redux、dva、C…

【Python】语句与众所周知【自我维护版】

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 本篇博客是在之前的基础上进行的维护 目录 条…

Find My资讯|苹果 iOS 17.5 率先执行跨平台反跟踪器标准

苹果和谷歌公司于 2023 年 5 月宣布推出“检测预期外位置追踪器”&#xff08;Detecting Unwanted Location Trackers&#xff09;行业标准&#xff0c;经过 1 年多的打磨之后&#xff0c;该标准目前已通过 iOS 17.5 部署到 iPhone 上。谷歌也将为运行 Android 6.0 或更高版本的…

多版本cuda安装与切换

本教程默认你熟练安装cuda&#xff0c;不清楚怎么安装可以看其他安装教程 1.确定下载需要的版本 找到你要安装的版本&#xff0c;不能高于你显卡支持的高版本 相关链接&#xff1a; CUDA Toolkit Archive | NVIDIA Developer NVIDIA控制面板--帮助--组件 NVCUDA64.DLL表示…

React 第三十八章 React 中的位运算

位运算是一种计算机编程中常用的操作&#xff0c;它直接对二进制位进行操作。二进制&#xff0c;指的就是以二为底的一种计数方式&#xff0c;常见的还有八进制、十进制、十六进制。 十进制0123456789101112131415二进制0000000100100011010001010110011110001001101010111100…

职业生涯第一课---“Redis分布式锁优化:确保唯一性与效率“

前言 最近因为刚入职公司开启自己的实习生涯&#xff0c;工作和毕设论文同步进行&#xff0c;导致有段时间没更新博客了&#xff0c;今天来分享一下最近学到的一些知识。 场景介绍 BOSS让我写一些接口&#xff0c;他提出这样一个需求&#xff0c;该接口的参数有多个&#xf…

【Linux】线程周边001之多线程

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.线程的理解 2.地址…

吴恩达深度学习笔记:优化算法 (Optimization algorithms)2.8

目录 第二门课: 改善深层神经网络&#xff1a;超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第二周&#xff1a;优化算法 (Optimization algorithms)2.8 Adam 优化算法(Adam optimization algor…

短视频批量剪辑,智能素材文案生成,多账号授权私信回复与矩阵发布素材功能合集系统,短视频矩阵助手源码搭建部署源码开源部署方案。

目录 一、短视频矩阵助手系统是什么&#xff1f; 二、短视频矩阵助手系统可以为企业解决什么问题&#xff1f; 短视频矩阵助手可以解决哪些问题&#xff1f; 三、短视频矩阵助手系统功能有哪些&#xff1f; 四、总结 一、短视频矩阵助手系统是什么&#xff1f; 短视频矩阵…

环保科普馆如何互动化加深观众环保认知?

如今&#xff0c;多媒体技术的广泛应用&#xff0c;已经为环保、天文、生物等各类主题展厅注入了新的活力&#xff0c;在这些展馆中&#xff0c;它凭借独特的互动体验&#xff0c;以及深入浅出的教育方式&#xff0c;赢得了广大观众的热烈追捧。今天&#xff0c;我们就一同探讨…

阿里巴巴发布最新财报,营收重回增长轨道

KlipC报道&#xff1a;5月14日&#xff0c;阿里巴巴集团发布2024财年及第四财季最新财报&#xff0c;财报显示第四财季收入2218.74亿元&#xff0c;同比增长7%&#xff0c;超出市场预期。2024财年收入同比增长8%&#xff0c;达9411.68亿元。 第四财季净利润244.2亿元人民币&am…

【设计模式】JAVA Design Patterns——Aggregator Microservices(聚合器微服务模式)

&#x1f50d;目的 用户对聚合器服务进行一次调用&#xff0c;然后聚合器将调用每个相关的微服务。 &#x1f50d;解释 真实世界例子 网络市场需要有关产品及其当前库存的信息。 它调用聚合服务&#xff0c;聚合服务依次调用产品信息微服务和产品库存微服务&#xff0c;返回组合…

制作coco类型数据集

COCO格式数据集简介 COCO数据集是一个大型的、丰富的物体检测&#xff0c;分割和字幕数据集。这个数据集以scene understanding&#xff08;场景理解&#xff09;为目标&#xff0c;主要从复杂的日常场景中截取&#xff0c;图像中的目标通过精确的segmentation&#xff08;分…

不懂技术可以当项目经理吗?看完这篇你就知道了

项目经理作为项目的核心负责人&#xff0c;主要负责项目的规划、组织、协调和控制。 如果你不懂技术&#xff0c;但具备出色的项目管理技能&#xff0c;你仍然可以成功地管理项目。你可以通过与技术团队建立紧密的合作关系&#xff0c;明确项目需求&#xff0c;并依赖技术团队…

IntelliJ IDEA - 查看项目工程代码量统计

首先安装一个统计插件——Statistic 接着在左下角可以看到 Statistic Logo 插件&#xff0c;点击即可看到统计面板

正则表达式和sed

一、正则表达式 主要用来匹配字符串&#xff08;命令结果&#xff0c;文本内容&#xff09;&#xff0c; 通配符匹配文件&#xff08;而且是已存在的文件&#xff09; 基本正则表达式 扩展正则表达式 1.元字符 . 匹配任意单个字符&#xff0c;可以是一个汉字 […

第 8 章 机器人底盘Arduino端PID控制(自学二刷笔记)

重要参考&#xff1a; 课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 讲义链接:Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 8.4.5 底盘实现_04Arduino端PID控制 上一节最后测试时&#xff0c;电机可能会出现抖动、顿挫的现象&#xff…

ubuntu下安装pwndbg

安装pwndbg 如果可以科学上网 首先安装git apt install git 然后拉取git库 git clone GitHub - pwndbg/pwndbg: Exploit Development and Reverse Engineering with GDB Made Easy 进入到pwngdb的文件夹中 cd pwngdb 执行 ./setup.sh 而后输入gdb 出现红色pwndgb就是安装成功…