Spring Security 从入门到精通之环境搭建与HelloWorld案例源码详解(二)

Spring Security (一):自定义认证 Spring Security 是一个提供身份验证授权和针对常见攻击的保护的框架,spring security 在程序启动时,向spring中注入一个默认的filterChian,按照顺序,依次执行filter,对用户信息进行认证,授权。官网链接: Spring Security :: Spring SecurityCorsFilterCsrfFilterOpenIDSiteMinder其中,默认的认证过滤器为 UsernamePasswordAuthenticationFilter。 阅读详情

1.前言

在上一篇文章:Spring Security 从入门到精通之架构理解 我们熟悉了Spring Security授权、认证基本概念,下面将搭建HelloWorld入门案例。

2. HelloWorld快速入门

由于Spring Security 与 Spring 生态无缝衔接,所以在Spring Boot中只需引入web与security的依赖即可,依赖如下所示:

<!--Spring boot Web容器-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
 
<!--引入SpringSecurity依赖-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-security</artifactId>
</dependency>

然后我们添加一个测试类并在类中新增一个方法如下所示:
在这里插入图片描述
然后启动项目,当访问此接口时会自动跳转到登陆页面,当我们登陆成功才可以访问到此接口。
在这里插入图片描述
默认Spring Security 内置了一个用户账户:user,其默认密码在项目控制台可以看到如下:
在这里插入图片描述
当输入用户名和密码后登陆成功后,就可以直接访问接口了。这样一个简单的入门案例就完成了。

3. 入门案例分析

3.1 自动配置分析

只需要引入相关依赖,Spring Security 默认就将我们的接口给保护起来了,必须认证才能继续访问,那么 Spring Security 是如何做到的呢?首先我们需要关注一下 Spring Boot 自动配置Spring Security类 SecurityAutoConfiguration 如下所示:
在这里插入图片描述
我们看到这个类默认导入了SpringBootWebSecurityConfiguration(web Security的默认配置类),此类定义内容如下所示:
在这里插入图片描述
通过上面defaultSecurityFilterChain 方法我们可以看到其默认对任何请求开启了认证。这也是我们默认在Spring Boot项目中引入Spring Security 后接口需要认证才可以访问的根本原因。3.1.2 章节我们提到了Spring Security 过滤器原理。defaultSecurityFilterChain 默认返回的是一个SecurityFilterChain 实例,我们可以看看其默认配置的filter有如下15个:
在这里插入图片描述

过滤器作用说明
过滤器过滤器作用是否默认加载
ChannelProcessingFilter过滤请求协议如Http与Https否
WebAsyncManagerIntegrationFilter将WebAsyncManager与 Spring Security 进行集成是
SecurityContextPersistenceFilter在处理请求前,将安全信息加载到SecurityContextHolder中以方便后续使用,请求结束再从SecurityContextHolder删除是
HeaderWriterFilter头信息加入响应中是
CorsFilter处理跨域问题否
CsrfFilter 处理CSRF攻击是
LogoutFilter注销登陆是
OAuth2AuthorizationRequestRedirectFilter处理Oauth2认证重定向否
Saml2WebSsoAuthenticationRequestFilter处理SAML认证否
X509AuthenticationFilter处理X509认证否
AbstractPreAuthenticatedProcessingFilter处理预认证否
CasAuthenticationFilter处理CAS单点登录否
OAuth2LoginAuthenticationFilter处理Oauth2认证否
Saml2WebSsoAuthenticationFilter处理SAML认证否
UsernamePasswordAuthenticationFilter处理表单认证是
OpenIDAuthenticationFilter处理OpenID认证否
DefaultLoginPageGeneratingFilter配置默认登陆页面是
DefaultLogoutPageGeneratingFilter配置默认注销页面是
ConcurrentSessionFilter处理Session有效期否
DigestAuthenticationFilter处理Http摘要认证否
BearerTokenAuthenticationFilter处理Oauth2认证时的Access Token否
BasicAuthenticationFilter处理Http Basic认证是
RequestCacheAwareFilter处理请求缓存是
SecurityContextHolderAwareRequestFilter包装原始请求是
JaasApiIntegrationFilter处理JAAS认证否
RememberMeAuthenticationFilter处理记住我认证否
AnonymousAuthenticationFilter配置匿名认证是
OAuth2AuthorizationCodeGrantFilter处理Oauth2中的授权码否
SessionManagementFilter处理Session并发问题是
ExceptionTranslationFilter处理异常认证/授权中的情况是
FilterSecurityInterceptor处理授权是
SwitchUserFilter处理账户切换否

Spring Security 内置了30个过滤器,在我们一个Hello World案例中默认启动了15个,Spring Security正是通过这些过滤器来实现其认证与授权。下面我们大概了解一下 Spring Security 的过滤器实现。

3.2 过滤器原理分析

Spring Security 认证模块、授权模块都是基于过滤器完成的,需要注意的是Spring Security默认并不是直接使用web Servlet容器中的Filter,而是实现了自己的过滤器并提供了一个DelegatingFilterProxy类,这个类会将Spring Security定义的过滤器转化为原生的Servlet容器中的Filter,并将这个Filter注册到原生过滤器链(Servlet容器过滤器链)中,如下图所示:
在这里插入图片描述
Spring Security中过滤器不仅仅只有一个,可能会有多个并组成一个滤器链。所以Spring Security 提供了一个SecurityFilterChain 用来管理多个过滤器。而这个过滤器了链又被一个特殊的过滤器 FilterChainProxy统一管理,此过滤器内嵌在DelegatingFilterProxy中,如下图所示:
在这里插入图片描述
Spring Security 可以通过不同的请求url 形成多个过滤器链路,多个过滤器需要指定优先级。当请求到达DelegatingFilterProxy中通过FilterChainProxy进行分发,匹配上那些过滤器链就用那些过滤器处理请求。
在这里插入图片描述

3.3 登陆页面生成源码分析

首先我们知道Spring Security 的认证与授权都是基于过滤器完成的,当我们在浏览器中输入:http://127.0.0.1:8001/helloWorld 后,这条请求先后都会经过默认启用的15个过滤器。
我们通过Debug 源码可以跟踪其登陆流程,关键跟踪源代码节点如下:

  • FilterSecurityInterceptor拦截请求并抛出AccessDeniedException。

首先helloWorld请求经过若干过滤器后,最终到达过滤器FilterSecurityInterceptor#doFilter方法
在这里插入图片描述
doFilter 方法调用了本类的invoke方法,接着调用了父类AbstractSecurityInterceptor的beforeInvocation方法的如下所示:
在这里插入图片描述
父类beforeInvocation方法调用了自己的attemptAuthorization方法,方法定义如下:
在这里插入图片描述
此方法调用了访问决策器接口的decide方法,此方法实现是由类AffirmativeBased实现如下所示:
在这里插入图片描述
投票器AccessDecisionVoter 投了反对票,所以此方法抛出了AccessDeniedException异常。

  • 抛出AccessDeniedException异常被ExceptionTranslationFilter捕获并交由LoginUrlAuthenticationEntryPoint类处理并重定向到登陆页面。

请求抛出的异常被ExceptionTranslationFilter捕获并调用了handleSpringSecurityException方法进行处理如下:
在这里插入图片描述
在这个方法中又调用了handleAccessDeniedException方法如下所示:
在这里插入图片描述
然后接着调用了sendStartAuthentication方法如下所示:
在这里插入图片描述
接着调用了在sendStartAuthentication方法中继续调用了类的authenticationEntryPoint实例#commence方法如下:
在这里插入图片描述
此实例是由LoginUrlAuthenticationEntryPoint类实现,我们关注其commence方法如下所示:
在这里插入图片描述
可以清晰看到请求重定向 http://127.0.0.1:8001/login。然后这个请求又要过一次过滤器链直到DefaultLoginPageGeneratingFilter的doFilter方法如下所示:
在这里插入图片描述
在这个方法中response输入了一个静态的html代码,所以我们就能看到最开始登陆的页面:
在这里插入图片描述
整个流程总结如下所示:
在这里插入图片描述

3.4 默认用户与密码生成源码分析

Spring Security中定义了UserDetailsService接口规范开发者自定义的用户对象接口查询,这样很方便用户将系统集成Spring Security 认证体系中,此接口只有一个查询用户详情的方法:
在这里插入图片描述
此方法参数只有一个username参数,注意这里的username并不是前端表单输入的用户名而是用户登陆成功后返回的用户名。在实际项目中,需要用户手动实现UserDetailsService。在HelloWorld案例中Spring Security提供了UserDetailsService接口的默认实现。
在这里插入图片描述
当我们只引入了Spring Security依赖,UserDetailsService 默认实现为InMemoryUserDetailsManager。此类提供了用户新增、删除、更新方法,这些方法都是基于内存实现(用户信息保存在Map中)。
在这里插入图片描述
再回到上面提到的UserDetailsService#loadUserByUsername 返回了一个用户详情对象,此对象接口提供了如下方法:
在这里插入图片描述
Spring Security 默认配置UserDetailsService的实现类为UserDetailsServiceAutoConfiguration。
在这里插入图片描述
在上面的代码中我们不难发现,InMemoryUserDetailsManager默认实现条件(@ConditionalOnClass、@ConditionalOnBean、@ConditionalOnMissingBean注解),在inMemoryUserDetailsManager方法中我们可以看到默认初始化的用户信息来自于类SecurityProperties,这个类是Spring Security属性配置类,类定义如下所示:
在这里插入图片描述
这个类中内部维护一个用户对象,用户类定义如下:
在这里插入图片描述
在这里我们就很清晰了解了为什么Spring Security内置的用户名是user,以及密码是长长的UUID字符串原因了。由于SecurityProperties是一个属性配置类,所以我们可以在项目配置文件自定义用户属性(覆盖默认的用户信息)。

「技术原理」Spring Security的核心功能和加载运行流程的原理分析 SpringSecurity的架构总览 Spring Security的简介说明 Spring Security对认证、授权和常见漏洞保护提供了全方位支持。使用的版本为:Spring Security 5.5.2。 概念释义 认证(Authentication):认证就是对试图访问资源的用户进行验证。 认证的场景就是 登录 流程,常见的方式就是要求提供用户名和密码,当验证通过的时候,就可以执行授权操作。 授权(Authority):授权就是对资源进行权限设置,只有用户具... 阅读详情

相关推荐

springboot整合springsecurity从Hello World到源码解析(一):hello world程序入门

springboot整合springsecurity从Hello World到源码解析(一):hello world程序入门 security   摘要:权限控制在我们的项目当中一般都有用到,有简单的登录就搞定的权限访问,也有分级身份的权限控制, 而权限控制的方式对于不同的需求也有多种选择,小到使用代码硬编码,自定义过滤器,自定义拦截器等等。更加灵活的方式则是使用已有的权限工具。 如s...

jsbintask的博客 712

Spring Security 表单配置(二)

Spring Security 表单配置,用户名密码认证逻辑

青春逝如流水 640

Python 静态导入与动态导入

python中模块的静态导入 与 动态导入(运行时指定模块),以及具体对应示例。

慢也好,步子小也好,往前走就好~ 717

Spring Security基础详细介绍

1. SpringSecurity 框架简介 1.1 概要 Spring 是非常流行和成功的 Java 应用开发框架,Spring Security正是Spring家族中的成员。Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案。 正如你可能知道的关于安全方面的两个主要区域是“认证”和“授权”(或者访问控制),一般来...

qq_36595761的博客 2754

TCN+iTransformer时间序列预测实战:从风电功率预测到源码解析(附完整代码)

本文深入探讨了TCN与iTransformer融合模型在时间序列预测,特别是风电功率预测中的应用。通过解析iTransformer‘倒置’视角的创新架构与TCN强大的局部时序捕捉能力,文章提供了完整的融合方案设计、源码实现及实战调优经验,旨在构建更强大的下一代预测引擎。

weixin_29062671的博客 265

STM32G0实战:HAL库与LL库Flash操作避坑指南(附HardFault解决方案)

本文深入剖析了STM32G0系列微控制器在Flash操作中常见的HardFault问题,对比了HAL库与LL库在读写擦除操作上的底层差异与潜在陷阱。文章提供了基于寄存器状态分析的精准调试方法,并给出了经过实战检验的解决方案与健壮的代码框架,帮助开发者有效规避数据丢失与系统崩溃风险。

t8u9v0w1x的博客 730

Spring Security(二):三分钟入门HelloWorld

基于上篇文章的《Spring Security(一):10分钟搭建项目结构》已经清楚了整体的项目结构,本篇文章下面主要介绍如何快速入门 HelloWorld。 1、zjj-security-demo创建启动类ZjjSecurityDemoApplication package com.zjj.security; import org.springframework.boot.Sprin...

zhujunjun6的专栏 197

青龙面板实战:用快手极速版脚本日赚XX元的核心参数解析

本文深入解析了青龙面板运行快手极速版脚本的核心参数配置,旨在帮助进阶用户提升收益稳定性。重点剖析了设备标识符(did)的获取原理、多账号Cookie的精准拼接规则,以及如何通过科学设置定时任务频率来量化并优化收益,实现细水长流的稳定收益。

weixin_29310605的博客 1075

Spring security oauth2最简单入门环境搭建--二、干货

关于OAuth2的一些简介,见我的上篇blog:http://wwwcomy.iteye.com/blog/2229889 PS:貌似内容太水直接被鹳狸猿干沉。。 友情提示 学习曲线:spring+spring mvc+spring security+Oauth2基本姿势,如果前面都没看过请及时关闭本网页。 我有信心我的这个blog应该是迄今为止使用spring security oa

z2007130205的专栏 6236

ROS激光雷达动态避障算法优化(C++实战)

本文深入探讨了ROS激光雷达动态避障算法的C++实战优化。针对动态环境的核心挑战,文章系统性地介绍了从激光数据预处理(降噪、瘦身)、动态障碍物检测与跟踪,到基于动态窗口法(DWA)的智能决策与调优的全流程。重点分享了如何将障碍物速度预测融入DWA打分函数,以实现更安全、流畅的避障,并提供了工程架构、性能优化及真机调试的实用建议。

weixin_29192141的博客 945

VFH避障/局部路径规划算法

VFH避障/局部路径规划算法 本文章是我看《The Vector Field Histogram-Fast Obstacle Avoidance for Mobile Robots》论文时候的笔记,感兴趣的欢迎去看原论文。 VFH中有一些概念是从其他算法中借鉴过来的,并且VFH算法本身就是对VFF(Virtural Force Field)的一种改进,其中有很多的相似之处。所以按照原论文的思路,先介绍由CMU提出的Certainty Grid算法中的一些概念,再介绍一下势场法中的一些概念,接着介绍一下VFF

qq_41845878的博客 8118

Spring Security(四):自定义用户认证逻辑

继续接着第二篇文章《Spring Security(二):三分钟入门HelloWorld 》进行自定义用户认证。 基本思路:自定义SpringSecurity安全框架的配置类,并继承WebSecurityConfigurerAdapter,重写configure方法 自定义基本配置 1、【zjj-security-browser 工程】自定义SpringSecurity安全框架的配置...

zhujunjun6的专栏 368

【校园网代理连接问题】已解决,“该设备或资源(Web 代理)未设置为接受端口“7890”上的连接“

我遇到这个问题很多次。每次都是vpn的问题,不止通俗意义上的梯子(clash之类的),还包括校园网vpn。点击“ 拨号和虚拟专用网络设置”中的“设置”, 关闭代理服务器。在打开vpn后或者关闭vpn后无法浏览网页,网页诊断显示“关闭“手动设置代理”中的“使用代理服务器”,关闭对应的本地代理即可。

聆雨。 1万+

从HelloWorld深入源码了解SpringSecurity底层逻辑

为什么引⼊之后没有任何配置所有请求就要认证呢?这就不得不提SpringBoot的默认配置类, 这个类是⾃动配置类,通过这个源码得知,默认情况下对所有请求进⾏权限控制。这就是为什么在引⼊ Spring Security 中没有任何配置情况下,请求会被拦截的原因!classpath中存在条件⼆ 没有⾃定义默认情况下,条件都是满⾜的。这个类极其重要,核⼼配置都在这个类中如果要对进⾏⾃定义配置,就要⾃定义这个类实例,通过覆盖类中⽅法达到修改默认配置的⽬的对于。

写写平时的技术与感想 2144

三维荧光光谱(EEM)散射干扰实战:从识别到精准切除的完整流程

本文详细解析三维荧光光谱(EEM)中散射干扰的识别与精准切除流程,涵盖瑞利散射和拉曼散射的实战处理技巧。通过drEEM工具箱的应用示例和高级场景解决方案,帮助研究者有效消除散射干扰,提升数据准确性,特别适用于环境样品和生物活体样本分析。

weixin_42554042的博客 327

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

spring security 最简单的demo

Spring 是一个非常流行和成功的 Java 应用开发框架。Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案。 下面简单我们来搭建一个spring security的helloworld的 1.使用Spring Initializr新建一个spring boot 2.添加security和web模块 3.新建一个静态页面 ...

jagger的专栏 1138

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

springsecurity权限控制_springsecurity从Hello World到源码解析(一):hello world程序入门...

摘要:权限控制在我们的项目当中一般都有用到,有简单的登录就搞定的权限访问,也有分级身份的权限控制, 而权限控制的方式对于不同的需求也有多种选择,小到使用代码硬编码,自定义过滤器,自定义拦截器等等。更加灵活的方式则是使用已有的权限工具。 如shiro,springsecurity等。而本系列博客将重点介绍springsecurity的工作原理以及应用。 springsecurity的官方介绍:Spr...

weixin_39743369的博客 152

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Spring Security 01- 将 Spring security 引入到工程

Spring security 系列博客目录 Spring Security 01- 将 Spring security 引入到工程 Spring security 02-自定义用户登录页面和登录处理逻辑 Spring security 03-自定义登录成功后的处理逻辑 Spring sec...

240

Spring Boot 全流程学习建议:避开新手常见坑

学习路径:「补前置基础 → 跑通 HelloWorld → 逐个突破核心特性 → 实战小项目 → 按需进阶」,拒绝贪多;核心重点:先掌握「注解 + 配置文件 + Web 接口 + 数据访问」,这是 SpringBoot 开发的核心;关键原则:「先会用,再懂原理」,新手别一开始就钻「自动配置源码」,先通过实战建立信心,再回头啃原理。

2303_81108291的博客 1048

前端转全栈与AI开发:Java零基础入门到实战项目指南

面向对象编程(OOP)是构建复杂软件系统的核心范式,其通过封装、继承和多态三大特性,将数据与操作封装成对象,提升了代码的可维护性和复用性。这一原理在Java语言中得到了充分体现,使其成为企业级后端开发的基石。掌握Java不仅意味着理解强类型、JVM内存管理等底层概念,更意味着获得了构建高并发、可扩展系统的工程能力。在技术价值层面,Java凭借Spring Boot等成熟框架,能够快速搭建RESTful API和微服务,为全栈开发和AI应用提供稳定可靠的后端支撑。对于希望从前端拓展至全栈或AI应用开发的工程师

weixin_33904756的博客 523

SpringSecurity篇-(1)-零配置启用

如果用版本对应的版本,各位一定要注意下,5.7版本前后有一些配置是不一样的,我这里先记录5.7以后的配置Maven只需要引入两个依赖 直接来一个吧! 尝试请求 http://localhost:9001/hello(端口自己配哈),SpringSecurity会默认跳到其登录页在什么都不配置的情况下,SpringSecurity已经帮我们做了安全控制仔细观察控制台日志可以看到为我们生成了一个默认密码,并且提示我们,此密码仅供开发模式使用,你一定要在生产环境更改安全配置作者看到这里的时候不禁有两个疑问:部分猿

PowerJ的博客 希望对你有帮助 1962

SpringBoot——HelloWorld(入门项目,用户登录,REST,JPA)

项目源码:https://github.com/yicaifenchen8/SpringBoot_HelloWorld.git 1.创建项目 2.选择项目模板 3.创建数据表实体 @Entity public class User { @Id private String id; private String name; private Str...

笑笑的博客 277

SpringSecurity学习记录__HelloWorld案例__01

Spring Security 简介 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。  一个能够为基于Spring的企业应用系统提供声明式的安全訪问控制解决方式的安全框架(简单说是对访问权限进行控制),应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分。用户认证指的是验...

Coder_Boy_的博客 283

Ubuntu 20.04 apt安装Java四层模型:源策略、包结构、运行时与环境变量

Java开发环境配置是软件工程的基础环节,其核心在于理解JDK的组成结构、包管理机制与运行时加载原理。在Linux发行版中,APT包管理器通过严格的包命名规范(如openjdk-17-jdk与openjdk-17-jdk-headless)体现功能边界,而update-alternatives系统则负责多版本命令调度。关键的技术价值在于实现Java版本可控、编译运行一致、环境变量可靠——这直接决定Maven构建成功率、IDEA调试稳定性及Spring Boot等框架的启动可靠性。典型应用场景包括Ubuntu

weixin_33698043的博客 547
上一篇: Spring Security 从入门到精通之架构理解(一)
下一篇: Spring Security 入门之自定义表单登录开发实现(三)
Galen-gao
博客等级 码龄9年 931粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值