# 使用 FilterSecurityInterceptor 授权 HttpServletRequest

|   |`FilterSecurityInterceptor`正在被[`AuthorizationFilter`]替换。<br/>考虑使用它。|
|---|----------------------------------------------------------------------------------------------------------------------------------------------------------|

本节通过深入研究[授权](index.html#servlet-authorization)在基于 Servlet 的应用程序中的工作方式，构建了[Servlet Architecture and Implementation](../architecture.html#servlet-architecture)。

[`FilterSecurityInterceptor`]（https://DOCS. Spring.io/ Spring-security/site/DOCS/5.6.2/api/org/springframework/security/web/access/intercept/filtersecurityinterceptor.html）为`HttpServletRequest`s 提供[授权](index.html#servlet-authorization)。它作为[安全过滤器](../architecture.html#servlet-security-filters)中的一个插入到[FilterchainProxy](../architecture.html#servlet-filterchainproxy)中。

![过滤安全拦截器](https://docs.spring.io/spring-security/reference/_images/servlet/authorization/filtersecurityinterceptor.png)

图 1。授权 HttpServletRequest

* ![number 1](https://docs.spring.io/spring-security/reference/_images/icons/number_1.png)首先，`FilterSecurityInterceptor`从[SecurityContextholder](../authentication/architecture.html#servlet-authentication-securitycontextholder)得到一个[认证](../authentication/architecture.html#servlet-authentication-authentication)。

* ![number 2](https://docs.spring.io/spring-security/reference/_images/icons/number_2.png)第二，`FilterSecurityInterceptor`从`HttpServletRequest`、`HttpServletResponse`和`FilterChain`中创建一个[`FilterChain`（https://DOCS. Spring.io/ Spring-security/site/site/DOCS/5.6.2/api/org/springframework/security/web/filterinvocation.html），并传递到`HttpServletRequest`中的`HttpServletResponse`和`FilterChain`中。

* ![number 3](https://docs.spring.io/spring-security/reference/_images/icons/number_3.png)下一步，它将`FilterInvocation`传递到`SecurityMetadataSource`，得到`ConfigAttribute`s。

* ![number 4](https://docs.spring.io/spring-security/reference/_images/icons/number_4.png)最后，它将`Authentication`、`FilterInvocation`和`ConfigAttribute`s 传递给 Xref: Servlet/授权。ADOC#authz-access-decision-manager`AccessDecisionManager`。

  * ![number 5](https://docs.spring.io/spring-security/reference/_images/icons/number_5.png)如果拒绝授权，将抛出`AccessDeniedException`。在这种情况下，[`ExceptionTranslationFilter`]（../architecture.html# Servlet-ExceptionTranslationFilter）处理`AccessDeniedException`。

  * ![number 6](https://docs.spring.io/spring-security/reference/_images/icons/number_6.png)如果访问被授予，`FilterSecurityInterceptor`继续使用[滤清链](../architecture.html#servlet-filters-review)，这允许应用程序正常处理。

默认情况下， Spring Security 的授权将要求对所有请求进行身份验证。显式配置如下所示：

例 1。每个请求都必须经过验证。

爪哇

```
protected void configure(HttpSecurity http) throws Exception {
	http
		// ...
		.authorizeRequests(authorize -> authorize
			.anyRequest().authenticated()
		);
}
```

XML

```
<http>
	<!-- ... -->
	<intercept-url pattern="/**" access="authenticated"/>
</http>
```

Kotlin

```
fun configure(http: HttpSecurity) {
    http {
        // ...
        authorizeRequests {
            authorize(anyRequest, authenticated)
        }
    }
}
```

我们可以通过按优先级顺序添加更多规则来配置 Spring 安全性，使其具有不同的规则。

例 2。授权请求

爪哇

```
protected void configure(HttpSecurity http) throws Exception {
	http
		// ...
		.authorizeRequests(authorize -> authorize                                  (1)
			.mvcMatchers("/resources/**", "/signup", "/about").permitAll()         (2)
			.mvcMatchers("/admin/**").hasRole("ADMIN")                             (3)
			.mvcMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')")   (4)
			.anyRequest().denyAll()                                                (5)
		);
}
```

XML

```
<http> (1)
	<!-- ... -->
	(2)
	<intercept-url pattern="/resources/**" access="permitAll"/>
	<intercept-url pattern="/signup" access="permitAll"/>
	<intercept-url pattern="/about" access="permitAll"/>

	<intercept-url pattern="/admin/**" access="hasRole('ADMIN')"/> (3)
	<intercept-url pattern="/db/**" access="hasRole('ADMIN') and hasRole('DBA')"/> (4)
	<intercept-url pattern="/**" access="denyAll"/> (5)
</http>
```

Kotlin

```
fun configure(http: HttpSecurity) {
   http {
        authorizeRequests { (1)
            authorize("/resources/**", permitAll) (2)
            authorize("/signup", permitAll)
            authorize("/about", permitAll)

            authorize("/admin/**", hasRole("ADMIN")) (3)
            authorize("/db/**", "hasRole('ADMIN') and hasRole('DBA')") (4)
            authorize(anyRequest, denyAll) (5)
        }
    }
}
```

|**1**|指定了多个授权规则。<br/>每个规则都按照它们被声明的顺序被考虑。|
|-----|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|**2**|我们指定了任何用户都可以访问的多个 URL 模式。<br/>具体来说，如果 URL 以“/resources/”开头，等于“/signup”或等于“/about”，则任何用户都可以访问请求。|
|**3**|任何以“/admin/”开头的 URL 都将被限制为具有角色“role\_admin”的用户。<br/>你将注意到，由于我们正在调用`hasRole`方法，因此我们不需要指定“role\_”前缀。|
|**4**|任何以“/db/”开头的 URL 都要求用户同时具有“role\_admin”和“role\_DBA”。<br/>你将注意到，由于我们使用的是`hasRole`表达式，因此我们不需要指定“role\_”前缀。|
|**5**|任何尚未匹配的 URL 都将被拒绝访问。<br/>如果你不想意外地忘记更新授权规则，这是一个很好的策略。|

[授权 HTTP 请求](authorize-http-requests.html)[基于表达式的访问控制](expression-based.html)

