`

SpringSecurity 3.2 简单介绍默认使用的十一个过滤器

 
阅读更多

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“拒绝访问异常”。
功能三:如果用户已登录,也具有访问当前资源的权限,则放行。

 

分享到:
评论

相关推荐

    springsecurity官方文档3.2

    - **添加自定义过滤器**: 如何向 Spring Security 添加自定义的安全过滤器。 - **设置自定义认证入口点**: 如何配置自定义的认证入口点。 - **方法安全**: - **`&lt;global-method-security&gt;` 元素**: 介绍该元素...

    Spring Security3.2的contacts示例代码

    在Spring Security 3.2版本中, contacts 示例代码是一个经典的实例,用于展示如何使用该框架来保护应用程序的资源,实现用户认证和授权。 在 contacts 示例中,Spring Security 会演示以下几个核心概念: 1. **...

    spring-security3.2jar

    6. **CSRF防护**:为了防止跨站请求伪造攻击,Spring Security 3.2默认开启了CSRF保护。它生成并验证CSRF令牌,确保只有来自同一会话的请求才能执行敏感操作。 7. **国际化支持**:Spring Security 3.2支持多语言...

    spring_security3.2_详细配置_培训笔记

    在这个例子中,我们看到`ContextLoaderListener`用于初始化Spring应用上下文,`DelegatingFilterProxy`作为Spring Security的过滤器链的代理。`springSecurityFilterChain`过滤器映射到所有的URL,这意味着Spring ...

    springboot2.7.10+springSecurity5.7.10+mybatisplus3.5.3.2整合实现用户校验

    在本文中,我们将深入探讨如何将Spring Boot 2.7.10、Spring Security 5.7.10 和 MyBatisPlus 3.5.3.2 整合在一起,实现一个完整的用户验证系统。这个系统允许用户在自定义的登录页面上输入用户名和密码,并通过查询...

    Spring Security 2.0.x完全中文参考文档

    通过这个示例展示如何在实际的应用场景中使用Spring Security。 - **3.3. LDAP例子** 展示了如何使用LDAP作为用户认证的方式。 - **3.4. CAS例子** 集成了CAS(Central Authentication Service),实现单点...

    Spring Security 安全权限管理手册.pdf

    - 描述如何将配置的过滤器和命名空间应用到实际项目中,构建一个完整的Spring Security安全体系。 - **1.4 运行示例** - 提供一个具体的示例,演示如何运行配置好的Spring Security项目。 **2. 使用数据库管理...

    spring security 参考手册中文版

    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-reference-zh

    通过简单的示例介绍了如何使用 Spring Security 的安全命名空间来配置基本的安全功能。 ###### 2.4.3 高级网站功能 对于更复杂的网站应用场景,可以使用高级配置选项来定制网站的安全策略。 ###### 2.4.4 方法安全...

    springsecurity.pdf

    ##### 3.2 过滤器 过滤器是Acegi Security中的关键组件之一,用于拦截HTTP请求并对请求进行预处理。常见的过滤器包括: - **认证过滤器**:用于处理用户的登录请求。 - **异常转换过滤器**:将认证失败等异常转换...

    SpringSecurity_AlsoDB.rar

    - **Filter Security Interceptor (FSI)**:这是一个过滤器,处理HTTP请求并决定是否允许访问。它通过配置安全规则来实现。 - **Authentication Manager**:处理认证请求,尝试验证用户凭证。 - **...

    Spring Security 3.0.1 pdf 中文参考文档

    - **内容:** 包含了一个简单的 Spring Security 应用程序示例,用于演示如何配置和使用 Spring Security。 **3.2 Contacts** - **内容:** 介绍如何在 Spring Security 中配置联系人管理功能。 **3.3 LDAP 例子**...

    spring-security-4.0.1-reference

    处理已配置的对象,例如添加过滤器或修改默认行为等。 #### IV. 命名空间配置 Spring Security 还提供了基于 XML 的命名空间配置,使得配置变得更加简洁。 ##### 4.1 命名空间设计概述 - **命名空间的设计**: ...

    SpringSecurity 3.0.1.RELEASE.CHM

    7.4. 使用其他过滤器 —— 基于框架 8. 核心安全过滤器 8.1. FilterSecurityInterceptor 8.2. ExceptionTranslationFilter 8.2.1. AuthenticationEntryPoint 8.2.2. AccessDeniedHandler 8.3. ...

    Spring Security3技术手册

    - Spring Security通过一系列的过滤器来实现对Web应用程序的安全控制。了解如何配置这些过滤器是入门Spring Security的关键。 - **示例代码**: 在`web.xml`中配置`&lt;filter&gt;`和`&lt;filter-mapping&gt;`,定义Spring ...

Global site tag (gtag.js) - Google Analytics