springSecurity过滤web请求的项目实践

 更新时间:2025年09月09日 09:54:10   投稿:zx  
SpringSecurity是一个功能强大的安全框架,提供了全面的 Web 安全功能,它的核心之一是过滤器链,用于拦截和处理 Web 请求,本文就来介绍SpringSecurity配置和使用过滤器来管理Web请求的安全性,感兴趣的可以了解一下

Spring Security 是一个功能强大的安全框架,提供了全面的 Web 安全功能。它的核心之一是过滤器链,用于拦截和处理 Web 请求。本文将详细介绍如何在 Spring Security 中配置和使用过滤器来管理 Web 请求的安全性。

一、Spring Security 过滤器链

Spring Security 使用过滤器链来处理所有进入应用程序的 HTTP 请求。这些过滤器按顺序执行,每个过滤器负责特定的安全功能,如身份验证、授权、会话管理、跨站点请求伪造(CSRF)保护等。

  1. 核心过滤器

    • SecurityContextPersistenceFilter:从存储中加载 SecurityContext 到 SecurityContextHolder
    • UsernamePasswordAuthenticationFilter:处理基于表单登录的身份验证。
    • BasicAuthenticationFilter:处理 HTTP Basic 验证。
    • ExceptionTranslationFilter:处理安全异常,如访问被拒绝和身份验证失败。
    • FilterSecurityInterceptor:执行访问决策。

二、配置 Spring Security 过滤器链

要配置 Spring Security 的过滤器链,可以通过扩展 WebSecurityConfigurerAdapter 类并重写 configure 方法来实现。以下是一个示例配置:

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
 
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
 
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf().disable() // 禁用 CSRF 保护
            .authorizeRequests()
                .antMatchers("/public/**").permitAll() // 允许所有用户访问 /public 路径
                .antMatchers("/admin/**").hasRole("ADMIN") // 仅允许具有 ADMIN 角色的用户访问 /admin 路径
                .anyRequest().authenticated() // 其他请求需要认证
                .and()
            .formLogin()
                .loginPage("/login") // 自定义登录页面
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }
}
​

三、常见的过滤器配置

  1. 身份验证

    • 通过 UsernamePasswordAuthenticationFilter 实现表单登录身份验证。
    • 通过 BasicAuthenticationFilter 实现 HTTP Basic 验证。
  2. 授权

    • 通过 FilterSecurityInterceptor 配置 URL 级别的访问控制。
    • 使用 @PreAuthorize 和 @Secured 注解进行方法级别的访问控制。
  3. 会话管理

    • 通过 SessionManagementFilter 管理会话策略,如会话并发控制和会话固定攻击防护。
  4. 跨站点请求伪造(CSRF)保护

    • 默认情况下启用,通过 CsrfFilter 实现。可以通过 http.csrf().disable() 禁用 CSRF 保护。

四、示例代码解析

下面是一个完整的示例,展示了如何配置 Spring Security 来管理 Web 请求的安全性:

配置类

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
 
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf().disable()
            .authorizeRequests()
                .antMatchers("/", "/home").permitAll()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .antMatchers("/user/**").hasAnyRole("USER", "ADMIN")
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }
 
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .withUser("user").password(passwordEncoder().encode("password")).roles("USER")
            .and()
            .withUser("admin").password(passwordEncoder().encode("admin")).roles("ADMIN");
    }
 
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}
​

说明

  • authorizeRequests:配置 URL 级别的访问控制。/home 和 / 路径允许所有用户访问,/admin/** 路径仅允许 ADMIN 角色访问,其他路径需要认证。
  • formLogin:配置基于表单的登录,指定自定义登录页面。
  • logout:配置登出功能,允许所有用户访问。
  • configure(AuthenticationManagerBuilder auth):配置内存中的用户存储,定义两个用户:user 和 admin。

 到此这篇关于springSecurity过滤web请求的项目实践的文章就介绍到这了,更多相关springSecurity过滤web请求内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java中数组的定义及使用方法(推荐)

    java中数组的定义及使用方法(推荐)

    下面小编就为大家带来一篇java中数组的定义及使用方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • SpringBoot生成和操作PDF的代码详解

    SpringBoot生成和操作PDF的代码详解

    本文主要介绍了在SpringBoot项目下,通过代码和操作步骤,详细的介绍了如何操作PDF,希望可以帮助到准备通过JAVA操作PDF的你,项目框架用的SpringBoot,但在JAVA中代码都是通用的,需要的朋友可以参考下
    2025-01-01
  • SpringBoot集成Redis之配置、序列化与持久化方式

    SpringBoot集成Redis之配置、序列化与持久化方式

    本文介绍了Redis的基本概念、常用数据类型及操作、SpringBoot整合Redis的方法、高级特性与安全性、性能优化、测试与部署、数据一致性及版本更新等内容,通过本文的学习,读者可以掌握Redis的使用方法,并在实际项目中发挥其优势
    2024-11-11
  • Java本地部署jenkins持续集成的实现

    Java本地部署jenkins持续集成的实现

    本文主要介绍了Java本地部署jenkins持续集成的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-07-07
  • 深入探究Java线程的创建与构造方法

    深入探究Java线程的创建与构造方法

    这篇文章主要给大家分享的是java线程的创建以及构造方法,想了解具体方式的小伙伴可以参考下面文章内容,希望对你有所帮助
    2022-04-04
  • Java 创建两个线程模拟对话并交替输出实现解析

    Java 创建两个线程模拟对话并交替输出实现解析

    这篇文章主要介绍了Java 创建两个线程模拟对话并交替输出实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Java使用Instant时输出的时间比预期少了八个小时

    Java使用Instant时输出的时间比预期少了八个小时

    在Java中,LocalDateTime表示没有时区信息的日期和时间,而Instant表示基于UTC的时间点,本文主要介绍了Java使用Instant时输出的时间比预期少了八个小时的问题解决,感兴趣的可以了解一下
    2024-09-09
  • java多线程读取多个文件的方法

    java多线程读取多个文件的方法

    这篇文章主要为大家详细介绍了java多线程读取多个文件的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • Java的基础语法学习笔记

    Java的基础语法学习笔记

    这里为大家整理了Java的基础语法学习笔记,包括关键词、运算符与基本的流程控制语句写法等,需要的朋友可以参考下
    2016-05-05
  • 使用Spring动态修改bean属性的key

    使用Spring动态修改bean属性的key

    这篇文章主要介绍了使用Spring动态修改bean属性的key方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05

最新评论