`
阅读更多
Spring Security的web架构是完全基于标准的servlet过滤器的。 它没有在内部使用servlet或任何其他基于servlet的框架(比如spring mvc), 所以它没有与任何特定的web技术强行关联。 它只管处理HttpServletRequest 和HttpServletResponse,不关心请求时来自浏览器,web服务客户端,HttpInvoker还是一个AJAX应用。
Spring Security维护了一个过滤器链,每个过滤器拥有特定的功能,过滤器需要服务也会对应添加和删除。 过滤器的次序是非常重要的,它们之间都有依赖关系。 如果你已经使用了命名空间配置,过滤器会自动帮你配置, 你不需要定义任何Spring Bean,但是有时候你需要完全控制Spring过滤器链, 因为你使用了命名空间没有提供的特性,或者你需要使用你自己自定义的类。
7.1. DelegatingFilterProxy
当使用servlet过滤器时,你很需要在你的web.xml中声明它们, 它们可能被servlet容器忽略。在Spring Security,过滤器类也是定义在xml中的spring bean, 因此可以获得Spring的依赖注入机制和生命周期接口。 spring的DelegatingFilterProxy提供了在 web.xml和application context之间的联系。
当使用DelegatingFilterProxy,你会看到像 web.xml文件中的这样内容:
<filter>
    <filter-name>myFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>myFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
        


注意这个过滤器其实是一个DelegatingFilterProxy,这个过滤器里没有实现过滤器的任何逻辑。 DelegatingFilterProxy做的事情是代理Filter的方法,从application context里获得bean。 这让bean可以获得spring web application context的生命周期支持,使配置较为轻便。 bean必须实现javax.servlet.Filter接口,它必须和filter-name里定义的名称是一样的。查看DelegatingFilterProxy的javadoc获得更多信息。
7.2. FilterChainProxy
现在应该清楚了,你可以声明每个Spring Security过滤器bean,你在application context中需要的。 把一个DelegatingFilterProxy入口添加到web.xml, 确认它们的次序是正确的。 这是一种繁琐的方式,会让web.xml显得十分杂乱,如果我们配置了太多过滤器的话。 我们最好添加一个单独的入口,在web.xml中,然后在application context中处理实体, 管理我们的web安全bean。 这就是FilterChainProxy所做的事情。它使用DelegatingFilterProxy (就像上面例子中那样),但是对应的class是org.springframework.security.web.FilterChainProxy。 过滤器链是在application context中声明的。这里有一个例子:
<bean id="filterChainProxy" class="org.springframework.security.web.FilterChainProxy">
  <sec:filter-chain-map path-type="ant">
     <sec:filter-chain pattern="/webServices/**" filters="
           securityContextPersistenceFilterWithASCFalse,
           basicAuthenticationFilter,
           exceptionTranslationFilter,
           filterSecurityInterceptor" />
     <sec:filter-chain pattern="/**" filters="
           securityContextPersistenceFilterWithASCFalse,
           formLoginFilter,
           exceptionTranslationFilter,
           filterSecurityInterceptor" />
  </sec:filter-chain-map>
</bean>


你可能注意到FilterSecurityInterceptor声明的不同方式。 命名空间元素filter-chain-map被用来设置安全过滤器链。 它映射一个特定的URL模式,到过滤器链中,从bean名称来定义的filters元素。 它同时支持正则表达式和ant路径,并且只使用第一个出现的匹配URI。 在运行阶段FilterChainProxy会定位当前web请求匹配的第一个URI模式,由filters属性指定的过滤器bean列表将开始处理请求。 过滤器会按照定义的顺序依次执行,所以你可以对处理特定URL的过滤器链进行完全的控制。
你可能注意到了,我们在过滤器链里声明了两个SecurityContextPersistenceFilter(ASC是allowSessionCreation的简写,是SecurityContextPersistenceFilter的一个属性)。 因为web服务从来不会在请求里带上jsessionid,为每个用户代理都创建一个HttpSession完全是一种浪费。 如果你需要构建一个高等级最高可扩展性的系统,我们推荐你使用上面的配置方法。 对于小一点儿的项目,使用一个HttpSessionContextIntegrationFilter(让它的allowSessionCreation默认为true)就足够了。
在有关声明周期的问题上,如果这些方法被FilterChainProxy自己调用,FilterChainProxy会始终根据下一层的Filter代理init(FilterConfig)和destroy()方法。 这时,FilterChainProxy会保证初始化和销毁操作只会在Filter上调用一次, 而不管它在过滤器链中被声明了多少次)。你控制着所有的抉择,比如这些方法是否被调用 或targetFilterLifecycle初始化参数DelegatingFilterProxy。 默认情况下,这个参数是false,servlet容器生命周期调用不会传播到 DelegatingFilterProxy。
当我们了解如何使用命名控制配置构建web安全。 我们使用一个DelegatingFilterProxy,它的名字是“springSecurityFilterChain”。 你应该现在可以看到FilterChainProxy的名字,它是由命名空间创建的。
7.2.1. 绕过过滤器链
通过命名空间,你可以使用filters = "none",来提供一个过滤器bean列表。 这会朝向请求模式,使用安全过滤器链整体。注意任何匹配这个模式的路径不会有任何授权或校验的服务 起作用,它们是可以自由访问的。
7.3. 过滤器顺序[/b]
定义在web.xml里的过滤器的顺序是非常重要的。 不论你实际使用的是哪个过滤器,<filter-mapping>的顺序应该像下面这样:
ChannelProcessingFilter,因为它可能需要重定向到其他协议。
ConcurrentSessionFilter,因为它不使用SecurityContextHolder功能,但是需要更新 SessionRegistry 来从主体中放映正在进行的请求。
SecurityContextPersistenceFilter,这样 SecurityContext可以在web请求的开始阶段通过 SecurityContextHolder建立,然后 SecurityContext的任何修改都会在web请求结束的时候(为下一个web请求做准备)复制到 HttpSession中。
验证执行机制 - UsernamePasswordAuthenticationFilter, CasAuthenticationFilter, BasicAuthenticationFilter 等等 - 这样 SecurityContextHolder 可以被修改,并包含一个合法的 Authentication 请求标志。
SecurityContextHolderAwareRequestFilter,如果,你使用它,把一个Spring Security提醒HttpServletRequestWrapper安装到你的servlet容器里。
RememberMeAuthenticationFilter,这样如果之前的验证执行机制没有更新 SecurityContextHolder,这个请求提供了一个可以使用的remember-me服务的cookie,一个对应的已保存的 Authentication对象会被创建出来。
AnonymousAuthenticationFilter,这样如果之前的验证执行机制没有更新 SecurityContextHolder,会创建一个匿名 Authentication对象。
ExceptionTranslationFilter,用来捕捉 Spring Security异常,这样,可能返回一个HTTP错误响应,或者执行一个对应的 AuthenticationEntryPoint。
FilterSecurityInterceptor,保护web URI。
7.4. 使用其他过滤器 —— 基于框架
如果你在使用SiteMesh,确认Spring Security过滤器在SiteMesh过滤器之前调用。 这可以保证SecurityContextHolder为每个SiteMesh渲染器及时创建。
分享到:
评论

相关推荐

    Spring Security 中文教程.pdf

    7. 安全过滤器链 7.1. DelegatingFilterProxy 7.2. FilterChainProxy 7.2.1. 绕过过滤器链 7.3. 过滤器顺序 7.4. 使用其他过滤器 —— 基于框架 8. 核心安全过滤器 8.1. FilterSecurityInterceptor ...

    SpringSecurity 3.0.1.RELEASE.CHM

    7. 安全过滤器链 7.1. DelegatingFilterProxy 7.2. FilterChainProxy 7.2.1. 绕过过滤器链 7.3. 过滤器顺序 7.4. 使用其他过滤器 —— 基于框架 8. 核心安全过滤器 8.1. FilterSecurityInterceptor 8.2. ...

    Spring Security-3.0.1中文官方文档(翻译版)

    7. 安全过滤器链 7.1. DelegatingFilterProxy 7.2. FilterChainProxy 7.2.1. 绕过过滤器链 7.3. 过滤器顺序 7.4. 使用其他过滤器—— 基于框架 8. 核心安全过滤器 8.1. FilterSecurityInterceptor ...

    spring security 参考手册中文版

    13.安全过滤器链 112 13.1 DelegatingFilterProxy 112 13.2 FilterChainProxy 113 13.2.1绕过滤网链 115 13.3过滤器排序 115 13.4请求匹配和HttpFirewall 116 13.5与其他基于过滤器的框架一起使用 118 13.6高级命名...

    bboss 安全认证过滤器功能介绍

    NULL 博文链接:https://yin-bp.iteye.com/blog/1449900

    用于隐私保护记录链接的基本布隆过滤器的密码分析-研究论文

    然而,到目前为止,关于布隆过滤器安全性的研究很少发表。 在本文中,我们对由二元组组成的布隆过滤器进行了成功的攻击。 攻击基于微妙的过滤和基本的统计分析。 最后,我们描述了用于防止类似攻击的布隆过滤器的...

    4、Spring Security 安全权限管理手册

    通过配置Servlet Filter激活SS中的过滤器链 实现Session一致性验证 实现免登陆验证(Remember-Me验证) 提供一系列标签库进行页面元素的安全控制 方法安全 通过AOP模式实现安全代理 Web安全与方法安全均可以使用...

    SpringBoot +esapi 实现防止xss攻击 实战代码

    SpringBoot +esapi springSecurity 过滤器链集成 实现防止xss攻击 实战代码

    交织::cyclone:React库可安全地呈现HTML,过滤器属性,使用匹配器自动换行文本,呈现表情符号字符等

    使用过滤器清除HTML属性。 使用匹配器插入组件。 自动链接URL,IP,电子邮件和主题标签。 渲染表情符号和表情符号字符。 以及更多! &lt; Interweave xss=removed&gt;HTML&lt;/b&gt; and will safely be rendered!" / &gt; &lt; ...

    JavaScript-canvas-:测试以在画布上应用各种过滤器

    在画布上应用各种过滤器的测试。 它包含许多不同的功能。 我想在不久的将来进入图书馆 ##文件概述, index.html-主html文件 ・ Index.js-函数 ##注意本地打开index.html时,诸如obj.getImageData()之类的功能不起...

    SpringSecurity项目

    springsecurity是一个功能强大且高度可定制...其核心就是一组过滤器链,项目启动后将会自动配置。最核心的就是 Basic Authentication Filter 用来认证用户的身份,一个在spring security中一种过滤器处理一种认证方式。

    SPOI过滤器「SPOI Filter」-crx插件

    SPOI过滤器 - 可让您隐藏和突出显示RSS消息项目的Feedly和Old Reader by关键字或正则表达式。 过滤器基于付费订阅模式。许可的用户将每月收费0.99美元。还有6个月和12个月的订阅,以及试用许可。 我们都喜欢用我们的...

    论文研究-基于Bloom Filter的混合云存储安全去重方案.pdf

    针对现有云存储系统中数据去重采用的收敛加密算法容易遭到暴力破解以及猜测攻击等不足,提出一种基于布隆过滤器的混合云存储安全去重方案BFHDedup,改进现有混合云存储系统模型,私有云部署密钥服务器Key Server支持...

    bleach-2.0.0-py2.py3-none-any.whl

    Bleach还可以安全地链接文本,应用Django的urlize 过滤器无法过滤的过滤器,还可以选择设置rel属性,即使在文本中已有的链接上也是如此。 Bleach旨在清理来自不受信任来源的文本。如果您发现自己不知所措以允许...

    unmangleOutlookSafelinks:用于解开 Outlook 保护安全链接的 Thunderbird 插件

    unmangleOutlookSafelinks用于解开 Outlook 保护安全链接的 Thunderbird 插件基于 原始版本启用了高级线程保护的 Office365 用户将更改电子邮件中的所有 URL,以在打开之前将它们重定向到 Microsoft 过滤器。...

    LinkRedirector-crx插件

    通过自定义过滤器重定向到您的任意地址的任何链接。 该扩展通过可定制的过滤器重定向到您的任意地址的任何链接。这个扩展包含了其他扩展的一些功能。 而且,这个扩展提供了由ImagePreviewer,SlideshowPlayer使用的...

    linkCue:linkCue-网站链接的待办事项列表。 使用流星

    用户加入 用户登录 用户界面 私人/公共类别 隐藏私人类别 公共和私人类别标签 用户限制 打开所有类别链接 私人支票过滤器 安全的数据库访问 添加新类别时更改选项卡类别 移动的 设计 列出所有用户 用户管理指南 部署

    Steam社区重定向绕过「Steam Community Redirect Bypass」-crx插件

    使用Google Chrome浏览器(将其设置为系统默认值)和Steam客户端的用户可以安装此插件,以立即重定向链接过滤器页面,而不需要用户点击“继续”链接。请注意,这种扩展在某种意义上破坏了安全功能,因此只能由高级...

    网络安全保障措施.docx

    安全扫描工具通常也分为基于服务器和基于网络的扫描器。折叠认证和数字签名技术认证技术主要解决网络通讯过程中通讯双方的身份认可,数字签名作为身份认证技术中的一种具体技术,同时数字签名还可用于通信过程中的不...

Global site tag (gtag.js) - Google Analytics