当前位置: 首页 > news >正文

spring security 使用的过滤器还是拦截器

spring security 使用的过滤器还是拦截器

Spring Security 是一个强大的安全框架,用于保护 Java 应用程序。它主要使用过滤器(Filters)来实现安全功能,而不是拦截器(Interceptors)。不过,它也提供了一些拦截器扩展功能,可以在某些场景下与 Spring MVC 拦截器配合使用。

Spring Security 的过滤器

Spring Security 主要通过一系列的过滤器来处理安全性。这些过滤器被组织成一个过滤器链,这个链会在每个 HTTP 请求到达实际处理代码之前进行处理。常见的过滤器有:

  • SecurityContextPersistenceFilter:管理 SecurityContext 的生命周期。
  • UsernamePasswordAuthenticationFilter:处理基于表单的登录。
  • BasicAuthenticationFilter:处理 HTTP 基本认证。
  • ExceptionTranslationFilter:捕获安全异常,将其转化为符合客户端期望的响应。
  • FilterSecurityInterceptor:最终进行访问控制决策。

配置 Spring Security 过滤器链

Spring Security 的过滤器链默认通过 DelegatingFilterProxy 进行配置,通常可以在 Spring 的配置类中自定义和扩展。

XML 配置

如果你使用 XML 配置,可以通过 web.xml 配置 DelegatingFilterProxy

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<beans:beans xmlns="http://www.springframework.org/schema/security"
             xmlns:beans="http://www.springframework.org/schema/beans"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://www.springframework.org/schema/security
             http://www.springframework.org/schema/security/spring-security.xsd
             http://www.springframework.org/schema/beans
             http://www.springframework.org/schema/beans/spring-beans.xsd">

    <http>
        <!-- 配置安全规则 -->
    </http>
</beans:beans>
Java 配置

使用 Java 配置,通过继承 WebSecurityConfigurerAdapter 并重写其方法来自定义安全配置:

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.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/public/**").permitAll()
                .anyRequest().authenticated()
            .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
            .and()
            .logout()
                .permitAll();
    }
}

Spring Security 拦截器

Spring Security 也提供了对拦截器的支持,比如方法级别的安全性(Method Security),可以通过注解来实现,如 @PreAuthorize@PostAuthorize

方法级别安全配置
启用方法级别的安全性

通过在配置类中启用方法级别的安全性:

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig {
    // 配置方法级别安全性
}
使用注解进行方法级别的安全控制
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Service;

@Service
public class MyService {

    @PreAuthorize("hasRole('ROLE_USER')")
    public void userMethod() {
        // 只有角色为 ROLE_USER 的用户才能访问此方法
    }

    @PreAuthorize("hasRole('ROLE_ADMIN')")
    public void adminMethod() {
        // 只有角色为 ROLE_ADMIN 的用户才能访问此方法
    }
}

主要区别

  1. 使用场景
    • 过滤器:Spring Security 主要使用过滤器来处理整体的请求/响应安全。
    • 拦截器:拦截器主要用于更多细粒度的控制,如方法级别的安全性。
  2. 实现机制
    • 过滤器:是 Servlet 规范的一部分,负责在请求进入和响应离开 Web 容器时进行处理。过滤器在 Servlet 容器级别工作,先于所有 Spring 组件执行。拦截器在 Spring MVC 的处理流程中执行,在控制器(Controller)处理请求前后。
    • 拦截器:拦截器是基于 Spring 的 AOP(面向切面编程), 在 HandlerMappingHandlerAdapter 的工作范围内。通常是通过框架提供的机制实现,如 Spring MVC 的HandlerInterceptor。拦截器仅作用于被 Spring MVC 管理的 Controller 请求。
  3. 配置方式
    • 过滤器:通过 DelegatingFilterProxyspringSecurityFilterChain 进行配置。
    • 拦截器:通过注解 @EnableGlobalMethodSecurity 和相关安全注解进行配置。
  4. 拦截器适用场景
    • 对特定的 Controller 请求处理前后进行拦截或者封装。
    • 拦截器不具备认证、授权的过滤能力,因为它工作在处理层,而非请求链路的入口层。
    • 过滤器适合处理请求和响应的通用逻辑(如字符编码、CORS等)
    • 拦截器更适合与 Spring 框架集成的功能(如方法级别的权限验证、方法级别的日志记录等)

总结

Spring Security 主要通过过滤器链实现请求和响应的安全处理,但也提供了方法级别的安全控制支持,允许你通过拦截器和注解来进行细粒度的安全控制。过滤器用于全局的 HTTP 请求安全管理,而拦截器则用于更具体的方法级别的权限控制。

Spring Security 主要是通过过滤器链处理请求(身份认证、权限校验等核心操作),而不是使用拦截器。但在特定情况下,拦截器可以配合 Spring Security 完成一些额外的逻辑处理,比如记录审计日志、扩展特定的请求处理行为等。


过滤器 拦截器

public class PerformanceFilter implements Filter {

public class PerformanceInterceptor implements HandlerInterceptor {

过滤器(Filters)和拦截器(Interceptors)是 Java Web 开发中常用的两种机制,用于在请求到达控制器之前或响应返回客户端之前进行预处理或后处理。虽然它们都可以用于类似的目的,但在实现机制和应用场景上有所不同。

过滤器(Filters)

过滤器是 Servlet API 的一部分,主要用于对 HTTP 请求和响应进行预处理和后处理。过滤器可以拦截和修改请求和响应,但不会修改实际的控制器处理逻辑。

使用场景
  • 检查或修改请求参数
  • 进行身份验证和授权
  • 记录日志
  • 数据压缩或加密
示例代码

下面是一个简单的过滤器,它记录每个请求的处理时间:

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter(urlPatterns = "/*")
public class PerformanceFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化代码
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        long startTime = System.currentTimeMillis();
        chain.doFilter(request, response);
        long endTime = System.currentTimeMillis();
        System.out.println("Request processed in " + (endTime - startTime) + " ms");
    }

    @Override
    public void destroy() {
        // 销毁代码
    }
}
配置

可以使用 @WebFilter 注解或在 web.xml 文件中配置过滤器。上面的例子使用的是 @WebFilter 注解。

拦截器(Interceptors)

拦截器通常是框架(如 Spring MVC)提供的机制,不是 Servlet API 的一部分。它用于在控制器方法调用之前和之后进行处理。拦截器比过滤器更强大,可以访问更多的信息,如控制器方法参数,返回值等。

使用场景
  • 用户认证和授权
  • 日志记录和分析
  • 统一异常处理
  • 数据格式转换
示例代码

以下是一个简单的 Spring MVC 拦截器,用于记录每个请求的处理时间:

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class PerformanceInterceptor implements HandlerInterceptor {
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        request.setAttribute("startTime", System.currentTimeMillis());
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {
        long startTime = (Long) request.getAttribute("startTime");
        long endTime = System.currentTimeMillis();
        System.out.println("Request processed in " + (endTime - startTime) + " ms");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // 完成处理
    }
}
配置

在 Spring MVC 中,你需要将拦截器注册到 WebMvcConfigurer

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new PerformanceInterceptor()).addPathPatterns("/**");
    }
}

主要区别

  1. 实现机制

    • 过滤器是 Servlet API 的一部分,可以应用于所有的 Servlet 请求。
    • 拦截器通常是框架(如 Spring MVC)提供的功能,主要用于控制器方法的调用。
  2. 使用范围

    • 过滤器可以应用于整个应用程序,无论是静态资源还是动态请求。
    • 拦截器通常只处理控制器方法的请求。
  3. 访问权限

    • 过滤器只能访问请求和响应对象,无法访问控制器方法的参数和返回值。
    • 拦截器可以访问控制器方法的参数和返回值,具有更高的灵活性。
  4. 配置方式

    • 过滤器可以在 web.xml 文件中配置,也可以使用注解。
    • 拦截器需要在框架配置文件中注册或使用代码进行配置。

总结

过滤器和拦截器都是预处理和后处理请求的有效机制,各有优缺点和适用的场景。在选择使用哪种机制时,可以根据需要处理的内容和应用程序的具体需求来选择。通常,过滤器适用于全局请求处理,而拦截器更适用于控制器级别的请求处理。

相关文章:

  • PTA团体程序设计天梯赛——L1-005 考试座位号
  • 一些题目记录
  • 市场波动中的风险管理与策略调整
  • 【愚公系列】《高效使用DeepSeek》032-育儿知识获取
  • 信息系统运行管理员教程2--信息系统运维的组织与管理
  • 【蓝桥杯每日一题】3.25
  • 【操作系统】进程三种状态?进程间状态的切换?挂起态?
  • html css 网页制作成品——HTML+CSS非遗文化扎染网页设计(5页)附源码
  • nvm 切换node 版本 但是没有带星号*
  • Vue 中directive的钩子函数(bind、inserted 等)的作用及使用场景
  • Spring Boot 的启动流程
  • Prompt Engineering:如何写出更高效的提示词?
  • qwindowkit 编译教程
  • 个人博客系统系统~测试报告
  • Linux UDP网络编程套接字sockets
  • 6.2 模拟专题:LeetCode 495. 提莫攻击
  • 基于python脚本实现的打砖块小游戏
  • jenkins+1panel面板java运行环境自动化部署java项目
  • 二分查找(java)
  • 大模型金融企业场景落地应用
  • 缅甸内观冥想的历史漂流:从心理治疗室到“非语言现场”
  • 中国科学院院士、我国航天液体火箭技术专家朱森元逝世
  • 四部门:强化汛期农业防灾减灾,奋力夺取粮食和农业丰收
  • 法治课|争议中的“行人安全距离”于法无据,考量“注意义务”才更合理
  • 从普通人经历中发现历史,王笛解读《线索与痕迹》
  • 美国政府信用卡被设1美元限额,10美元采购花一两小时填表