Spring Security Web : SecurityFilterChain 安全过滤器概念模型

SecurityFilterChain是Spring Security Web中的核心组件,用于抽象建模一组针对特定HTTP请求的安全过滤器。它由FilterChainProxy在配置阶段使用,并在请求到达时决定应用哪个SecurityFilterChain。DefaultSecurityFilterChain是其标准实现,包含请求匹配器和一组过滤器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SecurityFilterChain,字面意思"安全过滤器链",是Spring Security Web对匹配特定HTTP请求的一组安全过滤器的抽象建模。这样的一个对象在配置阶段用于配置FilterChainProxy,而FilterChainProxy在请求到达时会使用所持有的某个SecurityFilterChain判断该请求是否匹配该SecurityFilterChain,如果匹配的话,该SecurityFilterChain会被应用到该请求上。

FilterChainProxySpring Security Web添加到Servlet容器用于安全控制的一个Filter,换句话讲,从Servlet容器的角度来看,Spring Security Web所提供的安全逻辑就是一个Filter,实现类为FilterChainProxy。而实际上在FilterChainProxy内部,它组合了多个SecurityFilterChain,而每个SecurityFilterChain又组合了一组Filter,这组Filter也实现了Servlet Filter接口,但是它们对于整个Servlet容器来讲是不可见的。在本文中,你可以简单地将FilterChainProxy理解成多个SecurityFilterChain的一个封装。

SecurityFilterChain接口其实就定义了两个方法 :

  • 判断某个请求是否匹配该安全过滤器链 – boolean matches(HttpServletRequest request)
  • 获取该安全过滤器链所对应的安全过滤器 – List<Filter> getFilters()

    这组安全过滤器会最终被应用到所匹配的请求上

SecurityFilterChain接口定义看不到一个SecurityFilterChain对象是如何提供请求匹配的标准的。Spring Security WebSecurityFilterChain提供了缺省的标准实现DefaultSecurityFilterChain,从DefaultSecurityFilterChain的实现,你能全面地看到Spring Security Web在该功能点上的解决方案。

一个DefaultSecurityFilterChain对象定义时需要提供以下信息 :

  • 一个用于匹配特定请求的请求匹配器requestMatcher;
  • 针对所匹配的请求要应用的一组过滤器。

SecurityFilterChain/DefaultSecurityFilterChain代码都不算复杂,但是做到了向使用者Servlet容器屏蔽细节,这也算是软件工程中"关注点分离"这一概念的良好应用。

源代码

源代码版本 : Spring Security Web 5.1.4 RELEASE

1. SecurityFilterChain接口定义

package org.springframework.security.web;

import javax.servlet.Filter;
import javax.servlet.http.HttpServletRequest;
import java.util.*;


public interface SecurityFilterChain {

	boolean matches(HttpServletRequest request);

	List<Filter> getFilters();
}

2. SecurityFilterChain标准实现DefaultSecurityFilterChain

package org.springframework.security.web;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.security.web.util.matcher.RequestMatcher;

import javax.servlet.Filter;
import javax.servlet.http.HttpServletRequest;
import java.util.*;


public final class DefaultSecurityFilterChain implements SecurityFilterChain {
	private static final Log logger = LogFactory.getLog(DefaultSecurityFilterChain.class);
	private final RequestMatcher requestMatcher;
	private final List<Filter> filters;

	public DefaultSecurityFilterChain(RequestMatcher requestMatcher, Filter... filters) {
		this(requestMatcher, Arrays.asList(filters));
	}

	public DefaultSecurityFilterChain(RequestMatcher requestMatcher, List<Filter> filters) {
		logger.info("Creating filter chain: " + requestMatcher + ", " + filters);
		this.requestMatcher = requestMatcher;
		this.filters = new ArrayList<>(filters);
	}

	public RequestMatcher getRequestMatcher() {
		return requestMatcher;
	}

	public List<Filter> getFilters() {
		return filters;
	}

	public boolean matches(HttpServletRequest request) {
		return requestMatcher.matches(request);
	}

	@Override
	public String toString() {
		return "[ " + requestMatcher + ", " + filters + "]";
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值