文档章节

spring security filter chain

流光韶逝
 流光韶逝
发布于 2017/06/01 11:43
字数 1268
阅读 43
收藏 0

##13.the security Filter chain

spring security的web机制是基于标准的servlet拦截器的.它没有使用servlet或其他基于servlet的框架,因此它同web技术没有太强的关联.他处理httpServletRequest和response时,不会关心这些请求是来自浏览器,还是其他web服务客户端,一个HttpInvoker or ajax应用.

spring安全保持一个互相关联的拦截链.每个拦截链都有特定的职责并根据服务的需求来决定他们是否被添加.他们之间排序也很重要.有时你需要自定义这些类的版本.

##13.1 DelegatingFilterProxy

当你使用servlet拦截器,你需要在你的web.xml里声明他们.否则就会被servlet容器忽略.

如下使用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代理从spring应用上下文中获取的bean的拦截器方法.

###13.2 FilterChainProxy

spring security的web架构只应该用来代理FilterChainProxy的实例.理论上你可以在web.xml里注册各种filters,但这样会使是xml文件散乱.

<bean id="filterChainProxy" class="org.springframework.security.web.FilterChainProxy">
<constructor-arg>
	<list>
	<sec:filter-chain pattern="/restful/**" filters="
		securityContextPersistenceFilterWithASCFalse,
		basicAuthenticationFilter,
		exceptionTranslationFilter,
		filterSecurityInterceptor" />
	<sec:filter-chain pattern="/**" filters="
		securityContextPersistenceFilterWithASCTrue,
		formLoginFilter,
		exceptionTranslationFilter,
		filterSecurityInterceptor" />
	</list>
</constructor-arg>
</bean>

上例中根据url来区分. 你可以使用属性filters="none"来支持.这样会排除filter之外.如果你想使用securityContextHolder,那必须经过拦截链.

###13.3 拦截器顺序 顺序应该如下:

  • ChannelProcessingFilter,它可能会重定向到不同的协议.

  • SecurityContextPersistentceFilter,所以securityContextHolder安装SecurityContext,任何的一个改变都会到httpSession里.

  • ConcurrentSessionFilter 因为可以使用SecurityContextHolder的功能,所以可以使用SessionRegistry来反应来自主体的请求.

  • Authentication processing mechanisms 认证处理机制,UsernamePasswordAuthenticationFilter,CasAuthenticationFilter,BasicAuthenticationFilter等.所以springContextHolder会发生改变

  • SecurityContextHolderAwareRequestFilter.用来向你的servlet容器里安装HttpServletRequestWrapper组件

  • JaasApiIntegrationFilter,如果SecurityContextHolder里有JaasAuthenticationToken,那么就可以通过拦截器

  • RememberMeAuthenticationFilter.如果没有更早的安全认证机制来更新SecurityContextHolder,且请求中的代表的cookie能使remember-me发生作用,那么一个适当的Authentication对象就会装进去.

  • AnonymousAuthenticationFilter.如果之前的处理机制没有更新SecurityContextHolder,就会设置一个匿名的Authentication对象.

  • ExceptionTranslationFilter,捕获异常,可以返回http错误响应,或合适AuthenticationEntryPoint.

  • FilterSecurityInterceptor,用来保护web URIs,当访问受限会抛出异常

##13.4 Request Matching and httpFirewall

spring security有几个区域来决定那个请求应该被处理.当FilterChainProxy决定那个请求可以通过,FilterSecurityInterceptor决定那个安全限制适用于一个规则.

servlet规则定义了几种能被getter方法访问的httpServletRequest属性,如contextPath,servletPath,pathInfo,queryString.contextPath可以被忽略.但不幸的是,servletPath,pathInfo的值没有被准确定义.例如,每个url的部分可能包含属性值.但是该规则没有说明是否要包含在servletPath和pathInfo值中,还有不同servlet容器的区别.如果一个容器没有从url值中剥离这些参数很危险,攻击者可能把它们添加到请求url中,引起模板匹配的成功或失败.其他的变种在url请求中也是可能的.例如,他应该包含路径转化序列(如/../)或混合路径转化序列(//),那么这会引起正则表达式失败.有些容器会在servlet匹配之前将他们正常化,而有些则不会.为了保护这些问题,FilterChainProxy会使用HttpFirewall的策略来检测组装这些请求.不正常的请求默认会被拒绝.servletPath和pathInfo是由容器来解码的,所以你的应用不应该有任何有效的路径包含分号,如果有,则会被删除.

默认使用ant风格路径,这个是最好的选择.这个策略是通过AntpathRequestMatcher类实现的,它大小写敏感,匹配了servletPath和pathInfo,且忽略了queryString.

如果你需要更强力的匹配策略,那你可以使用正则表达式.这个策略是RegexRequestMatcher实现的,查看javadoc以了解更多.

实际上我们还在服务层使用访问控制,不完全依赖web层的安全防护.url的变化很难统计这些应用支持的url的数量,已经这些请求该如何被操作.你应该通过简单的例子来测试这些路径.一般情况下是默认拒绝的方式.

Security定义的安全很稳健,难以绕过.所以你应该更好的利用spring security的方法.

HttpFirewall通过拒绝新行字符来拒绝http响应.

###13.5 使用其他基于拦截器的框架

要讲spring security的拦截器放在其他拦截器之前./

###13.6 高级命名空间配置

<!-- Stateless RESTful service using Basic authentication -->
<http pattern="/restful/**" create-session="stateless">
<intercept-url pattern='/**' access="hasRole('REMOTE')" />
<http-basic />
</http>

<!-- Empty filter chain for the login page -->
<http pattern="/login.htm*" security="none"/>

<!-- Additional filter chain for normal users, matching all other requests -->
<http>
<intercept-url pattern='/**' access="hasRole('USER')" />
<form-login login-page='/login.htm' default-target-url="/home.htm"/>
<logout />
</http>

© 著作权归作者所有

共有 人打赏支持
流光韶逝
粉丝 19
博文 97
码字总数 126673
作品 0
济南
程序员
Spring Security3源码分析-FilterChainProxy初始化(转)

很久没有更新博客了,最近对Spring Security做了比较深入的研究。 spring security的教程网上很多: http://lengyun3566.iteye.com/category/153689 http://wenku.baidu.com/view/b0c0dc0b7...

blooms
2012/09/18
0
0
spring DelegatingFilterProxy管理过滤器(转)

安全过滤器链 Spring Security的web架构是完全基于标准的servlet过滤器的。它没有在内部使用servlet或任何其他基于servlet的框架(比如spring mvc),所以它没有与任何特定的web技术强行关联...

blooms
2012/09/18
0
0
为一个REST服务使用Spring Security的基本和摘要认证

原创翻译自:http://www.baeldung.com/2011/11/20/basic-and-digest-authentication-for-a-restful-service-with-spring-security-3-1/ 简介 这篇文章讨论的是如何在一个相同URI结构的REST ......

Big_BoBo
2014/01/16
0
0
Spring Security3.1登陆验证

一、前言 在上一篇http://blog.csdn.net/k10509806/archive/2011/04/28/6369131.aspx文章中,提到的MyUserDetailServiceImpl获取用户权限,在用户没有登陆的时候,Spring Security会让我们自...

lgl梁
2015/01/07
0
0
Spring Security授权过程

Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转...

李玉长
05/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

TypeScript基础入门之高级类型的多态的 this类型

转发 TypeScript基础入门之高级类型的多态的 this类型 高级类型 多态的this类型 多态的this类型表示的是某个包含类或接口的子类型。 这被称做F-bounded多态性。 它能很容易的表现连贯接口间的...

durban
20分钟前
0
0
tomcat中的几种log catalina localhost

体会 catalina.out catalina.log 是tomcat的标准输出(stdout)和标准出错(stderr) cataliana.{yyyy-MM-dd}.log和localhost.{yyyy-MM-dd}.log 是通过logging.properties配置的tomcat自己运行的......

onedotdot
42分钟前
1
0
Oracle return exit continue

常在循环体中看到下面3种语句: return exit continue 举例说明 啥都没有 -- none begin for i in 1 .. 10 loop if i < 5 then dbms_output.put_line('i < 5, i = ' || to_char......

taadis
今天
3
0
JSONObject 转换时出错 InvocationTargetException

JSONObject 转换时出错java.lang.reflect.InvocationTargetException 一时看不出来是什么问题。 挺奇怪的。 百度参考了一下这个 网页的解决方案 说是类型不对,空? 仔细查看代码,果然是有一...

之渊
今天
3
0
no such module 'pop'问题

在github上 clone 了一个 swift 项目,编译时提示"no such module 'POP'"错误,查了一下居然是因为podfile中指定的最低版本是iOS 11.0,大于我测试手机的iOS版本10.3.3,将Podfile中的最低版...

yoyoso
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部