0%

Spring Security 核心流程全解析:认证与权限控制的底层逻辑

Spring Security 的核心能力分为认证(Authentication)权限(Authorization) 两部分,分别对应 “确认用户身份” 和 “判断用户是否有权访问资源”。从 “请求拦截→认证处理→权限校验” 三个维度,逐行拆解流程中的关键组件与数据流转。

认证流程:从登录请求到身份确认

认证流程的核心是 “获取用户凭证→校验凭证→存储认证信息”,入口是 UsernamePasswordAuthenticationFilter(处理表单登录请求),最终通过 AuthenticationManagerUserDetailsService 完成校验。

1. 流程入口:UsernamePasswordAuthenticationFilter 拦截登录请求

UsernamePasswordAuthenticationFilter 是处理 POST /login(或自定义登录路径)请求的专用过滤器,继承自 AbstractAuthenticationProcessingFilter,其核心逻辑在父类的 doFilter() 方法中触发。

步骤 1:AbstractAuthenticationProcessingFilter#doFilter—— 过滤器核心调度

所有登录请求首先进入该方法,判断是否需要认证并触发后续逻辑:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;

// 1. 判断请求是否需要认证(是否是登录请求、是否已认证)
if (!requiresAuthentication(request, response)) {
chain.doFilter(request, response);
return;
}

Authentication authResult = null;
AuthenticationException failed = null;

try {
// 2. 核心:尝试认证(委托给子类实现,即 UsernamePasswordAuthenticationFilter#attemptAuthentication)
authResult = attemptAuthentication(request, response);
} catch (AuthenticationException e) {
failed = e;
}

// 3. 认证成功:处理成功逻辑(存储认证信息、跳转)
if (authResult != null) {
successfulAuthentication(request, response, chain, authResult);
}
// 4. 认证失败:处理失败逻辑(清理上下文、跳转错误页)
else if (failed != null) {
unsuccessfulAuthentication(request, response, failed);
}
}
阅读全文 »

Spring Security 过滤 Web 请求全解析:从过滤器链到请求授权配置

Spring Security 对 Web 请求的过滤核心是 “代理过滤器 + 链式过滤” 机制:通过 DelegatingFilterProxy 衔接 Servlet 容器与 Spring 容器,再由 FilterChainProxy 管理具体的安全过滤链,最终通过 HttpSecurity 配置请求拦截规则。从 “过滤器链原理→自动注册机制→核心配置→请求授权规则” 四个维度,彻底讲透 Spring Security 如何过滤和保护 Web 请求。

核心过滤器链:DelegatingFilterProxy 与 FilterChainProxy

Spring Security 的过滤能力依赖两层代理机制,解决了 “Servlet Filter 由容器管理,而 Spring Security Filter 是 Spring Bean” 的协同问题。

1. DelegatingFilterProxy:Servlet Filter 与 Spring Bean 的桥梁

DelegatingFilterProxy 是 Servlet 规范中的 Filter 实现,但它本身不处理请求,仅负责将请求委托给 Spring 容器中的 FilterChainProxy Bean(默认 Bean 名为 springSecurityFilterChain)。

核心作用
  • 解耦容器与 Spring:Servlet 容器(如 Tomcat)只能识别并管理 Filter 实例,而 Spring Security 的过滤逻辑封装在 Spring Bean 中,DelegatingFilterProxy 作为中间代理,实现两者通信;
  • 延迟查找目标 Bean:初始化时不直接依赖 FilterChainProxy,而是在请求到来时从 Spring 容器中查找,支持 Spring Bean 的懒加载。
自动注册机制(AbstractSecurityWebApplicationInitializer)

用户提供的代码中,SecurityWebApplicationInitializer 继承 AbstractSecurityWebApplicationInitializer,Spring 会自动检测该类,并在 Servlet 容器启动时注册 DelegatingFilterProxy

阅读全文 »

Spring Security 核心原理与组件详解

Spring Security 是基于 Spring 框架的安全解决方案,专注于为 Java 应用提供身份认证和授权功能。它利用 Spring AOP 和 Servlet 过滤器实现,其核心本质是一个过滤器链,通过一系列过滤器协同工作完成安全控制。

核心概念解析

主体(Principal)

使用系统的用户、设备或其他系统,即 “谁在使用系统”。在 Spring Security 中,主体通常通过 Authentication 对象表示。

认证(Authentication)

确认主体身份的过程,即 “证明你是谁”。认证成功后,用户信息会被存储在安全上下文中。

授权(Authorization)

授予主体操作权限的过程,即 “你能做什么”。通过判断主体是否拥有特定权限来允许或拒绝访问。

快速入门依赖

使用 Spring Boot 集成 Spring Security 只需添加以下依赖:

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
阅读全文 »

JVM 监控工具全指南:从命令行到可视化工具

监控是 JVM 性能优化和问题排查的基础。JDK 自带了丰富的命令行工具,同时还有多种可视化工具,覆盖从进程监控、GC 分析、内存快照到线程跟踪的全场景。本文将系统梳理这些工具的功能、用法及适用场景,帮助开发者快速定位和解决 JVM 相关问题。

JDK 自带命令行工具

命令行工具轻量高效,适合在服务器环境中快速排查问题,核心工具包括 jpsjstatjinfojmapjstackjcmd 等。

jps:查看 Java 进程信息

功能:列出当前运行的 Java 进程 ID 及主类信息,类似 ps 但仅针对 Java 程序。

用法

1
jps [-q] [-mlvV] [<hostid>]

常用选项

  • -q:仅显示进程 ID(PID),不显示主类名;
  • -l:显示主类全限定名(如 com.example.Application)或 JAR 包路径;
  • -m:显示传递给 main() 方法的参数;
  • -v:显示 JVM 启动参数(如 -Xms2g -Xmx2g)。

示例

1
2
3
4
jps -l  # 显示进程 ID 和主类全路径
# 输出:
# 12345 com.example.Application
# 67890 org.springframework.boot.loader.JarLauncher
阅读全文 »

Keepalived:高可用架构的核心保障工具

在分布式系统中,单点故障是威胁服务稳定性的 “隐形杀手”。Keepalived 作为一款基于 VRRP 协议的高可用解决方案,通过自动检测服务器状态、实现故障切换,为核心服务提供了可靠的冗余保障。本文将从原理、结构到实战配置,全面解析 Keepalived 的工作机制与应用价值。

Keepalived 核心功能:自动保障服务连续性

Keepalived 的核心目标是消除单点故障,确保服务在部分节点失效时仍能正常运行。其核心能力包括:

  • 状态侦测:实时监控服务器或服务的健康状态(如 IP 可达性、端口可用性、应用进程存活等);
  • 故障切换:当主节点故障时,自动将服务切换到备用节点,通过虚拟 IP(VIP)保证客户端无感知;
  • 自动恢复:当故障节点修复后,自动将其重新纳入集群,恢复主备关系。

无论是 Web 服务器、负载均衡器还是数据库,Keepalived 都能通过灵活的配置适配不同场景,是构建高可用架构的关键工具。

实现的基本思路

Keepalived是基于VRRP协议的实现,主要用在IP层、TCP层和应用层。

  • IP层:Keepalived会定期向服务器群中的服务器发送一个ICMP数据包(Ping),如果发现IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除。
  • TCP层:类似IP层,只不过这里是检测TCP服务的端口
  • 应用层:Keepalived将根据用户的设定来检查服务程序的运行是否正常

实现原理:基于 VRRP 协议的冗余机制

Keepalived 的高可用能力源于对 VRRP(虚拟路由冗余协议) 的实现。VRRP 解决了静态网关单点故障问题,通过将多台物理路由器虚拟为一个 “逻辑路由器”,确保网络通信的连续性。

阅读全文 »