初识 Spring Security之过滤器和过滤器链

439 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

Fileter

Filter 是 JavaEE 中 Servlet 规范的一个组件,位于包javax.servlet 中,它可以在 HTTP 请求到达 Servlet 之前,被一个或多个Filter处理。任何Spring Web本质上只是一个servlet。Security Filter在HTTP请求到达你的Controller之前过滤每一个传入的HTTP请求。

image.png

1.首先,过滤器需要从请求中提取一个用户名/密码。它可以通过一个基本的HTTP头,或者表单字段,或者cookie 等等。

2.然后,过滤器需要对用户名/密码组合进行验证比如数据库。

3.在验证成功后,过滤器需要检查用户是否被授权访问请求的 URI 。

4.如果请求通过了所有这些检查,那么过滤器就可以让请求通过你的DispatcherServlet后重定向到@Controllers 或者@RestController。

Fileter Chain

image.png

常见的内建过滤器

BasicAuthenticationFilter BasicAuthenticationFilter 负责处理 HTTP 头中显示的基本身份验证凭据。这个 Spring Security 的 Spring Boot 自动配置默认是启用的 。BasicAuthenticationFilter 通过 HttpSecurity#httpBasic() 及相关方法引入其配置对象 HttpBasicConfigurer 来进行配置。如果在请求中找到一个BasicAuthHTTP头,如果找到,则尝试用该头中的用户名和密码验证用户。

UsernamePasswordAuthenticationFilter 处理用户以及密码认证的核心过滤器。认证请求提交的username和 password,被封装成token进行一系列的认证,便是主要通过这个过滤器完成的,在表单认证的方法中,这是最最关键的过滤器。你可以通过 HttpSecurity#formLogin() 及相关方法引入其配置对象 FormLoginConfigurer 来进行配置。如果在请求参数或者POST的RequestBody中找到用户名/密码,则尝试用这些值对用户进行身份验证。

DefaultLoginPageGeneratingFilter 默认登录页面生成过滤器。用于生成一个登录页面,如果你没有明确地禁用这个功能,那么就会生成一个登录页面。这就是为什么在启用SpringSecurity时,会得到一个默认登录页面的原因。

DefaultLogoutPageGeneratingFilter 如果没有禁用该功能,则会生成一个注销页面。

FilterSecurityInterceptor 过滤安全拦截器。用于授权逻辑。这个过滤器决定了访问特定路径应该具备的权限,访问的用户的角色,权限是什么?访问的路径需要什么样的角色和权限?这些判断和处理都是由该类进行的。如果你要实现动态权限控制就必须研究该类 。

SwitchUserFilter SwitchUserFilter 是用来做账户切换的。默认的切换账号的url为/login/impersonate,默认注销切换账号的url为/logout/impersonate,默认的账号参数为username 。