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。
Spring Security是一个强大的开源安全框架,用于保护Web应用的安全,包括身份验证、授权和会话管理等功能。它提供了基于Java的拦截器体系结构,其中包括过滤器(Filter)机制来处理HTTP请求。 当涉及到请求后拦截时,Spring Security中的过滤器主要在以下几个阶段执行: 1. **预处理请求**(Pre-Handle):`doFilter()`方法被调用之前,`FilterChain`会首先调用`BeforeInvocationSecurityInterceptor`,这个阶段可以用来检查访问权限,如果请求未经过身份验证或权限不足,可以返回401或403响应,阻止访问进一步处理。 2. **实际业务处理**(Around-Invoke):`doFilter()`方法中,如果请求通过了预处理,过滤器会继续调用下一个`Filter`或`HandlerAdapter`处理请求。这阶段通常不会直接影响业务逻辑,但可以设置或修改请求上下文信息。 3. **后处理请求**(Post-Handle):`doFilter()`方法完成并返回响应后,还会调用`AfterCompletionFilter`,这时可以做清理工作,比如更新会话状态等。 4. **错误处理**(Exception-Translation):如果在上述阶段抛出了异常,会进入异常处理器(如`FilterInvocationExceptionResolver`),然后按照配置决定如何处理,例如记录日志、返回自定义错误页面等。 Spring Security过滤器可以通过配置文件或注解动态调整其行为,为每个URL路径提供定制化的安全策略。如果你想要实现特定的后拦截逻辑,可以在`Filter`类中添加自定义的方法,并根据需求调用`HttpServletRequest`的相应方法来进行操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值