Spring Security入门(1-12)Spring Security 的过滤器机制
Servlet过滤器被用来拦截用户请求来进行请求之前或之后的处理,或者干脆重定向这个请求,这取决于servlet过滤器的功能。
Servlet过滤器处理之后的目标servlet是 MVC 分发web servlet。
servlet请求按照一定的顺序从一个过滤器到下一个穿过整个过滤器链,最终到达目标servlet。与之相对的是,当servelt处理完请求并返回一个response时,过滤器链按照相反的顺序再次穿过所有的过滤器。

Spring Security利用Spring在XML配置文件中的自动配置属性,建立了十个servlet过滤器,这些过滤器并没有配置在web.xml中,而是由Spring Factory使用JavaEE的servlet过滤器链将他们按顺序组装。
Spring Security使用了过滤器链的实现了自己的抽象,提供了VirtualFilterChain,它可以根据Spring Security XML配置文件中设置的URL模式动态的创建过滤器链(可以将它与标准的Java EE过滤器链进行对比,后者需要在web应用的部署描述文件中进行设置)。
Spring Security的自动配置选项auto-config为你建立了十个Spring Security的过滤器。这些过滤器以及它们使用的顺序,在下面的表格中进行了描述。
如:UsernamePasswordAuthenticationFilter是通过<http>配置指令的<form-login>子元素来进行配置的。
|
过滤器名称 |
描述 |
|
o.s.s.web.context.SecurityContextPersistenceFilter |
负责从SecurityContextRepository获取或存储SecurityContext。SecurityContext代表了用户安全和认证过的session。 |
|
o.s.s.web.authentication.logout.LogoutFilter |
监控一个实际为退出功能的URL(默认为/j_spring_security_logout),并且在匹配的时候完成用户的退出功能。 |
|
o.s.s.web.authentication.UsernamePasswordAuthenticationFilter |
监控一个使用用户名和密码基于form认证的URL(默认为/j_spring_security_check),并在URL匹配的情况下尝试认证该用户。 |
|
o.s.s.web.authentication.ui.DefaultLoginPageGeneratingFilter |
监控一个要进行基于forn或OpenID认证的URL(默认为/spring_security_login),并生成展现登录form的HTML |
|
o.s.s.web.authentication.www.BasicAuthenticationFilter |
监控HTTP 基础认证的头信息并进行处理 |
|
o.s.s.web.savedrequest. RequestCacheAwareFilter |
用于用户登录成功后,重新恢复因为登录被打断的请求。 |
|
o.s.s.web.servletapi. SecurityContextHolderAwareRequest Filter |
用一个扩展了HttpServletRequestWrapper的子类(o.s.s.web. servletapi.SecurityContextHolderAwareRequestWrapper)包装HttpServletRequest。 它为请求处理器提供了额外的上下文信息。 |
|
o.s.s.web.authentication. AnonymousAuthenticationFilter |
如果用户到这一步还没有经过认证,将会为这个请求关联一个认证的token,标识此用户是匿名的。 |
|
o.s.s.web.session. SessionManagementFilter |
根据认证的安全实体信息跟踪session,保证所有关联一个安全实体的session都能被跟踪到。 |
|
o.s.s.web.access. ExceptionTranslationFilter |
解决在处理一个请求时产生的指定异常 |
|
o.s.s.web.access.intercept. FilterSecurityInterceptor |
简化授权和访问控制决定,委托一个AccessDecisionManager完成授权的判断 |
Spring Security拥有总共大约25个过滤器,它们能够根据你的需要进行适当的应用以改变用户请求的行为。
如果需要的话,你也可以添加你自己实现了javax.servlet.Filter接口的过滤器。
请记住,如果你在XML配置文件中使用了auto-config属性,以上表格中列出的过滤器自动添加的。
通过使用一些额外的配置指令,以上列表中的过滤器能够精确的控制是否被包含。
你可能想知道DelegatingFilterProxy是怎样找到Spring Security配置的过滤器链的。让我们回忆一下,在web.xml文件中,我们需要给DelegatingFilterProxy一个过滤器的名字:
|
<filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class> org.springframework.web.filter.DelegatingFilterProxy </filter-class> </filter> |
这个过滤器的名字并不是随意配置的,实际上会跟根据这个名字把Spring Security织入到DelegatingFilterProxy。除非明确配置,否则DelegatingFilterProxy会在Spring WebApplicationContext中寻找同名的配置bean(名字是在filter-name中指明的)。


三个主要的组件负责这项重要的事情:
|
接口名 |
描述/角色 |
|
AbstractAuthenticationProcessingFilter |
它在基于web的认证请求中使用。处理包含认证信息的请求,如认证信息可能是form POST提交的、SSO信息或者其他用户提供的。创建一个部分完整的Authentication对象以在链中传递凭证信息。 |
|
AuthenticationManager |
它用来校验用户的凭证信息,或者会抛出一个特定的异常(校验失败的情况)或者完整填充Authentication对象,将会包含了权限信息。 |
|
AuthenticationProvider |
它为AuthenticationManager提供凭证校验。一些AuthenticationProvider的实现基于凭证信息的存储,如数据库,来判定凭证信息是否可以被认可。 |
有两个重要接口的实现是在认证链中被这些参与的类初始化的,它们用来封装一个认证过(或还没有认证过的)的用户的详细信息和权限。
o.s.s.core.Authentication是你以后要经常接触到的接口,因为它存储了用户的详细信息,包括唯一标识(如用户名)、凭证信息(如密码)以及本用户被授予的一个或多个权限(o.s.s.core.
GrantedAuthority)。开发人员通常会使用Authentication对象来获取用户的详细信息,或者使用自定义的认证实现以便在Authentication对象中增加应用依赖的额外信息。
以下列出了Authentication接口可以实现的方法:
|
方法签名 |
描述 |
|
Object getPrincipal() |
返回安全实体的唯一标识(如,一个用户名) |
|
Object getCredentials() |
返回安全实体的凭证信息 |
|
List<GrantedAuthority> getAuthorities() |
得到安全实体的权限集合,根据认证信息的存储决定的。 |
|
Object getDetails() |
返回一个跟认证提供者相关的安全实体细节信息 |
Spring Security入门(1-12)Spring Security 的过滤器机制的更多相关文章
- Spring Security 入门(1-2)Spring Security - 从 配置例子例子 开始我们的学习历程
1.Spring Security 的配置文件 我们需要为 Spring Security 专门建立一个 Spring 的配置文件,该文件就专门用来作为 Spring Security 的配置. &l ...
- spring boot 入门一 构建spring boot 工程
最近在学习Spring boot,所以想通过博客的形式和大家分享学习的过程,同时也为了更好的学习技术,下面直接进入Spring boot的世界. 简介 spring boot 它的设计目的就是为例简化 ...
- 7 -- Spring的基本用法 -- 12... Spring 3.0 提供的表达式语言(SpEL)
7.12 Spring 3.0 提供的表达式语言(SpEL) Spring表达式语言(简称SpEL)是一种与JSP 2 的EL功能类似的表达式语言,它可以在运行时查询和操作对象图.支持方法调用和基本字 ...
- spring Boot 入门--为什么用spring boot
为什么用spring boot 回答这个问题不得不说下spring 假设你受命用Spring开发一个简单的Hello World Web应用程序.你该做什么? 我能想到一些 基本的需要. 一个项目 ...
- Spring Boot入门(12)实现页面访问量统计功能
在日常的网站使用中,经常会碰到页面的访问量(或者访问者人数)统计.那么,在Spring Boot中该如何实现这个功能呢? 我们的想法是比较简单的,那就是将访问量储存在某个地方,要用的时候取出来 ...
- Spring Boot入门篇(基于Spring Boot 2.0系列)
1:概述: Spring Boot是用来简化Spring应用的初始化开发过程. 2:特性: 创建独立的应用(jar|war形式); 需要用到spring-boot-maven-plugin插件 直接嵌 ...
- Spring框架学习(7)spring mvc入门
内容源自:spring mvc入门 一.spring mvc和spring的关系 spring mvc是spring框架提供的七层体系架构中的一个层,是spring框架的一部分,是spring用于处理 ...
- Spring Security 入门(一)
当你看到这篇文章时,我猜你肯定是碰到令人苦恼的问题了,我希望本文能让你有所收获. 本人几个月前还是 Spring 小白,几个月走来,看了 Spring,Spring boot,到这次的 Spring ...
- 030 SSM综合练习06--数据后台管理系统--SSM权限操作及Spring Security入门
1.权限操作涉及的三张表 (1)用户表信息描述users sql语句: CREATE TABLE users ( id ) DEFAULT SYS_GUID () PRIMARY KEY, email ...
- Spring Security 入门(1-1)Spring Security是什么?
1.Spring Security是什么? Spring Security 是一个安全框架,前身是 Acegi Security , 能够为 Spring企业应用系统提供声明式的安全访问控制. Spr ...
随机推荐
- Java的类C结构体的实现,以及对类的某一属性进行排序
public static class Foo { public int x1; public int x2; public int day; } public static Foo[] bridge ...
- xampp打开显示缺少运行库的解决方法
如图:,安装好xampp的时候直接打开会弹出上面那个错误,显示的原因是因为缺少运行库,点击"确定"之后会弹出一个网页,上面有解决方法:http://www.phpstudy.net ...
- Cesium polygon中的height和extrudedHeight的区别
1.height参数: 多边形和椭球表面之间的距离(以米为单位). 2.extrudedHeight参数: 多边形的挤压面与椭球面之间的距离(以米为单位).
- USB协议基础知识笔记
usb协议 功能层: 控制传输.中断传输.块传输(批量传输).同步传输 设备层:管理USB设备.分配地址.读取设备描述符 总线接口层:采用NRZI编码-反向非归零编码(0将前一个电平翻转,1不翻转) ...
- Python基础-week02
本节内容摘要:http://www.cnblogs.com/Jame-mei 0.xmind8破解及安装(想要破解版及资料请下方留言,这里不做具体说明) 1.模块初识 2.pyc是什么? 3.pyth ...
- 笔记:Spring Boot 监控与管理
在微服务架构中,我们将原本庞大的单体系统拆分为多个提供不同服务的应用,虽然,各个应用的内部逻辑因分解而简化,但由于部署的应用数量成倍增长,使得系统的维护复杂度大大提升,为了让运维系统能够获取各个为服务 ...
- pureftpd支持php实现图片上传
安装好php后,可安装pureftp工具 这里我给出一个rpm包可直接安装配置:http://pan.baidu.com/s/1i5OhS3r(包括启动脚本在内) FTP测试:安装ftp客户端,用户名 ...
- 配置SecureCRT以SSH公钥方式登录服务器
为了更方便管理服务器,CRT一个功能非常方便.那就是可以使用私钥认证通过后直接连接,而且对于密码保护比较安全一点. 首先配置ssh Port 32812Protocol 2UseDNS noPubke ...
- 使用ADO.NET查询和操作数据
使用ADO.NET查询和操作数据 StringBuilder类: 用来定义可变字符串StringBuilder sb = new StringBuilder("");//追加字符串 ...
- MySQL升级-5.6升级到5.7版本&切换GTID模式
目前未在生产环境中升级过数据库版本,倒是在测试环境跟开发环境升级过. 可以通过mysqldump sql文件进行升级,也可以通过mysql_upgrade升级,前者耗时较长,且 ...
