Security提供了20多个filter,每个过滤器都提供特定的功能。这些filter在Spring Security filter过滤器链中的缺省顺序由
org.springframework.security.config.http.SecurityFilters枚举类型定义。通过filter机制,Spring Security实现了安全认
证和授权等安全相关工作。用户通过配置文件,可以插入、替换或去除已知的filter,搭配自己的Spring Security filte过滤器链,
从而实现满足自己特定应用需求的安全处理。
当auto-config="true"的情况下,默认会用到十一个过滤器,并且它们有一定的使用顺序,如下图。
默认配置的十一个过滤器介绍如下:
1.HttpSessionContextIntegrationFilter
位于过滤器顶端,第一个起作用的过滤器。
用途一,在执行其他过滤器之前,率先判断用户的session中是否已经存在一个SecurityContext了。
如果存在,就把SecurityContext拿出来,放到SecurityContextHolder中,供Spring Security的其他部分使用。
如果不存在,就创建一个SecurityContext出来,还是放到SecurityContextHolder中,供Spring Security的其他部分使用。
用途二,在所有过滤器执行完毕后,清空SecurityContextHolder,因为SecurityContextHolder是基于ThreadLocal的,
如果在操作完成后清空ThreadLocal,会受到服务器的线程池机制的影响。
2.LogoutFilter
只处理注销请求,默认为/j_spring_security_logout。
用途是在用户发送注销请求时,销毁用户session,清空SecurityContextHolder,然后重定向到注销成功页面。
可以与rememberMe之类的机制结合,在注销的同时清空用户cookie。
3.AuthenticationProcessingFilter
处理form登陆的过滤器,与form登陆有关的所有操作都是在此进行的。
默认情况下只处理/j_spring_security_check请求,这个请求应该是用户使用form登陆后的提交地址,form所需的其他参数可以参考:
此过滤器执行的基本操作时,通过用户名和密码判断用户是否有效,如果登录成功就跳转到成功页面(可能是登陆之前访问的受保护页面,
也可能是默认的成功页面),如果登录失败,就跳转到失败页面。
<form action="${pageContext.request.contextPath}/j_spring_security_check" style="width:260px;text-align:center;"> <fieldset> <legend>登陆</legend> 用户: <input type="text" name="j_username" style="width:150px;" value="${sessionScope[‘SPRING_SECURITY_LAST_USERNAME‘]}"/><br /> 密码: <input type="password" name="j_password" style="width:150px;" /><br /> <input type="checkbox" name="_spring_security_remember_me" />两周之内不必登陆<br /> <input type="submit" value="登陆"/> <input type="reset" value="重置"/> </fieldset> </form>
/j_spring_security_check,提交登陆信息的URL地址。
自定义form时,要把form的action设置为/j_spring_security_check。注意这里要使用绝对路径,避免登陆页面存放的页面可能带来的问题。
j_username,输入登陆名的参数名称。
j_password,输入密码的参数名称
_spring_security_remember_me,选择是否允许自动登录的参数名称。
可以直接把这个参数设置为一个checkbox,无需设置value,Spring Security会自行判断它是否被选中。
4.DefaultLoginPageGeneratingFilter
此过滤器用来生成一个默认的登录页面,默认的访问地址为/spring_security_login,这个默认的登录页面虽然支持用户输入用户名,密码,
也支持rememberMe功能,但是因为太难看了,只能是在演示时做个样子,不可能直接用在实际项目中。
自定义登陆页面
<http auto-config=‘true‘> <intercept-url pattern="/login.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY" /> <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" /> <intercept-url pattern="/**" access="ROLE_USER" /> <form-login login-page="/login.jsp" authentication-failure-url="/login.jsp?error=true" default-target-url="/" /> </http>
5.BasicProcessingFilter
此过滤器用于进行basic验证,功能与AuthenticationProcessingFilter类似,只是验证的方式不同。
添加basic认证,去掉auto-config="true",并加上<http-basic />
<http auto-config="true">
<http-basic />
<intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" />
<intercept-url pattern="/" access="ROLE_USER" />
</http>
6.SecurityContextHolderAwareRequestFilter
此过滤器用来包装客户的请求。目的是在原始请求的基础上,为后续程序提供一些额外的数据。
比如getRemoteUser()时直接返回当前登陆的用户名之类的。
7.RememberMeProcessingFilter
此过滤器实现RememberMe功能,当用户cookie中存在rememberMe的标记,此过滤器会根据标记自动实现用户登陆,
并创建SecurityContext,授予对应的权限。
在配置文件中使用auto-config="true"就会自动启用rememberMe
实际上,Spring Security中的rememberMe是依赖cookie实现的,当用户在登录时选择使用rememberMe,系统就会在登录成功后将为用户生成一个唯一标识,
并将这个标识保存进cookie中,我们可以通过浏览器查看用户电脑中的cookie。
8.AnonymousProcessingFilter
为了保证操作统一性,当用户没有登陆时,默认为用户分配匿名用户的权限。
在配置文件中使用auto-config="true"就会启用匿名登录功能。在启用匿名登录之后,如果我们希望允许未登录就可以访问一些资源,可以在进行如下配置。
<http auto-config=‘true‘> <intercept-url pattern="/" access="IS_AUTHENTICATED_ANONYMOUSLY" /> <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" /> <intercept-url pattern="/**" access="ROLE_USER" /> </http>
设置成 ROLE_ANONYMOUS 也可以。
<http auto-config=‘true‘> <intercept-url pattern="/" filters="none" /> <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" /> <intercept-url pattern="/**" access="ROLE_USER" /> </http>
filters="none"表示当我们访问“/”时,是不会使用任何一个过滤器去处理这个请求的,它可以实现无需登录即可访问资源的效果,
但是因为没有使用过滤器对请求进行处理,所以也无法利用安全过滤器为我们带来的好处,最简单的,这时SecurityContext内
再没有保存任何一个权限主体了,我们也无法从中取得主体名称以及对应的权限信息。
9.ExceptionTranslationFilter
此过滤器的作用是处理中FilterSecurityInterceptor抛出的异常,然后将请求重定向到对应页面,或返回对应的响应错误代码。
10.SessionFixationProtectionFilter
防御会话伪造攻击。
解决session fix的问题其实很简单,只要在用户登录成功之后,销毁用户的当前session,并重新生成一个session就可以了。
<http auto-config=‘true‘ session-fixation-protection="none"> <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" /> <intercept-url pattern="/**" access="ROLE_USER" /> </http>
session-fixation-protection的值共有三个可供选择,none,migrateSession和newSession。默认使用的是migrationSession
11.FilterSecurityInterceptor
用户的权限控制都包含在这个过滤器中。
功能一:如果用户尚未登陆,则抛出AuthenticationCredentialsNotFoundException“尚未认证异常”。
功能二:如果用户已登录,但是没有访问当前资源的权限,则抛出AccessDeniedException“拒绝访问异常”。
功能三:如果用户已登录,也具有访问当前资源的权限,则放行。
相关推荐
- **添加自定义过滤器**: 如何向 Spring Security 添加自定义的安全过滤器。 - **设置自定义认证入口点**: 如何配置自定义的认证入口点。 - **方法安全**: - **`<global-method-security>` 元素**: 介绍该元素...
在Spring Security 3.2版本中, contacts 示例代码是一个经典的实例,用于展示如何使用该框架来保护应用程序的资源,实现用户认证和授权。 在 contacts 示例中,Spring Security 会演示以下几个核心概念: 1. **...
6. **CSRF防护**:为了防止跨站请求伪造攻击,Spring Security 3.2默认开启了CSRF保护。它生成并验证CSRF令牌,确保只有来自同一会话的请求才能执行敏感操作。 7. **国际化支持**:Spring Security 3.2支持多语言...
在这个例子中,我们看到`ContextLoaderListener`用于初始化Spring应用上下文,`DelegatingFilterProxy`作为Spring Security的过滤器链的代理。`springSecurityFilterChain`过滤器映射到所有的URL,这意味着Spring ...
在本文中,我们将深入探讨如何将Spring Boot 2.7.10、Spring Security 5.7.10 和 MyBatisPlus 3.5.3.2 整合在一起,实现一个完整的用户验证系统。这个系统允许用户在自定义的登录页面上输入用户名和密码,并通过查询...
通过这个示例展示如何在实际的应用场景中使用Spring Security。 - **3.3. LDAP例子** 展示了如何使用LDAP作为用户认证的方式。 - **3.4. CAS例子** 集成了CAS(Central Authentication Service),实现单点...
- 描述如何将配置的过滤器和命名空间应用到实际项目中,构建一个完整的Spring Security安全体系。 - **1.4 运行示例** - 提供一个具体的示例,演示如何运行配置好的Spring Security项目。 **2. 使用数据库管理...
13.5与其他基于过滤器的框架一起使用 118 13.6高级命名空间配置 118 14.核心安全筛选器 119 14.1 FilterSecurityInterceptor 119 14.2 ExceptionTranslationFilter 121 14.2.1 AuthenticationEntryPoint 122 14.2.2 ...
通过简单的示例介绍了如何使用 Spring Security 的安全命名空间来配置基本的安全功能。 ###### 2.4.3 高级网站功能 对于更复杂的网站应用场景,可以使用高级配置选项来定制网站的安全策略。 ###### 2.4.4 方法安全...
##### 3.2 过滤器 过滤器是Acegi Security中的关键组件之一,用于拦截HTTP请求并对请求进行预处理。常见的过滤器包括: - **认证过滤器**:用于处理用户的登录请求。 - **异常转换过滤器**:将认证失败等异常转换...
- **Filter Security Interceptor (FSI)**:这是一个过滤器,处理HTTP请求并决定是否允许访问。它通过配置安全规则来实现。 - **Authentication Manager**:处理认证请求,尝试验证用户凭证。 - **...
- **内容:** 包含了一个简单的 Spring Security 应用程序示例,用于演示如何配置和使用 Spring Security。 **3.2 Contacts** - **内容:** 介绍如何在 Spring Security 中配置联系人管理功能。 **3.3 LDAP 例子**...
处理已配置的对象,例如添加过滤器或修改默认行为等。 #### IV. 命名空间配置 Spring Security 还提供了基于 XML 的命名空间配置,使得配置变得更加简洁。 ##### 4.1 命名空间设计概述 - **命名空间的设计**: ...
7.4. 使用其他过滤器 —— 基于框架 8. 核心安全过滤器 8.1. FilterSecurityInterceptor 8.2. ExceptionTranslationFilter 8.2.1. AuthenticationEntryPoint 8.2.2. AccessDeniedHandler 8.3. ...
- Spring Security通过一系列的过滤器来实现对Web应用程序的安全控制。了解如何配置这些过滤器是入门Spring Security的关键。 - **示例代码**: 在`web.xml`中配置`<filter>`和`<filter-mapping>`,定义Spring ...