# 使用 FilterSecurityInterceptor 授权 HttpServletRequest
| |`FilterSecurityInterceptor`正在被[`AuthorizationFilter`]替换。
考虑使用它。|
|---|----------------------------------------------------------------------------------------------------------------------------------------------------------|
本节通过深入研究[授权](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
```
```
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
```
(1)
(2)
(3)
(4)
(5)
```
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**|指定了多个授权规则。
每个规则都按照它们被声明的顺序被考虑。|
|-----|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|**2**|我们指定了任何用户都可以访问的多个 URL 模式。
具体来说,如果 URL 以“/resources/”开头,等于“/signup”或等于“/about”,则任何用户都可以访问请求。|
|**3**|任何以“/admin/”开头的 URL 都将被限制为具有角色“role\_admin”的用户。
你将注意到,由于我们正在调用`hasRole`方法,因此我们不需要指定“role\_”前缀。|
|**4**|任何以“/db/”开头的 URL 都要求用户同时具有“role\_admin”和“role\_DBA”。
你将注意到,由于我们使用的是`hasRole`表达式,因此我们不需要指定“role\_”前缀。|
|**5**|任何尚未匹配的 URL 都将被拒绝访问。
如果你不想意外地忘记更新授权规则,这是一个很好的策略。|
[授权 HTTP 请求](authorize-http-requests.html)[基于表达式的访问控制](expression-based.html)