文档章节

spring security 核心过滤器

流光韶逝
 流光韶逝
发布于 2017/06/01 17:38
字数 1389
阅读 26
收藏 1
点赞 0
评论 0

#14. Core Security Filter 有很多关键过滤器在spring 安全的项目中总是使用,所以我们可以查看这些支持的类和接口.想要全面了解,请查看javadoc.

##14.1 FilterSecurityInterceptor

一个典型的配置如下

<bean id="filterSecurityInterceptor" class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor">
<property name="authenticationManager" ref="authenticationManager"/>
<property name="accessDecisionManager" ref="accessDecisionManager" />
<property name="securityMetadataSource">
		<security:filter-security-metadata-source>
		<security:intercept-url pattern="/secure/super/**" access="ROLE_WE_DONT_HAVE"/>
		<security:intercept-url pattern="/secure/**" access="ROLE_SUPERVISOR,ROLE_TELLER">
</property>

FilterSecurityInterceptor主要保护http资源的安全.它要求一个AuthenticationManager和一个AccessDecisionManager的引用.它也提供了一些配置属性来适应不同的http请求.

FilterSecurityInterceptor可以通过两种方式来配置属性.第一个,如上所述,使用<filter-security-metadata-source>命名空间.它与<http>空间很像,但它的子元素只有pattern,access元素.逗号用来划分不同http url的配置元素.第二选项是写自己的SecurityMetadataSource,但是这个超出了文本文件的内容.无论何种方法,SecurityMetadataSource用来返回关于单个http url的List<ConfigAttribute>.

filter-security-metadata-source的匹配表达式可以通过request-matcher来设置.默认是ant匹配.

<bean id="filterInvocationInterceptor"
	class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor">
<property name="authenticationManager" ref="authenticationManager"/>
<property name="accessDecisionManager" ref="accessDecisionManager"/>
<property name="runAsManager" ref="runAsManager"/>
<property name="securityMetadataSource">
	<security:filter-security-metadata-source request-matcher="regex">
	<security:intercept-url pattern="\A/secure/super/.*\Z" access="ROLE_WE_DONT_HAVE"/>
	<security:intercept-url pattern="\A/secure/.*\" access="ROLE_SUPERVISOR,ROLE_TELLER"/>
	</security:filter-security-metadata-source>
</property>
</bean>

模式按定义的顺序执行.重要的是指定一些具体模式的顺序在一些模糊模式之前.在我们的例子中,具体路径"/secure/super"的模式在"/secure/"模式之前.如果反转顺序,那么/secure/模式总会匹配,而/secure/super模式不会执行.

14.2 ExceptionTranslationFilter

ExceptionTranslationFilter是基于FilterSecurityInterceptor的栈中的.它本身不参与安全拦截,负责处理安全拦截器抛出的异常,并提供合适的http请求.

<bean id="exceptionTranslationFilter" class="org.springframework.security.web.access.ExceptionTranslationFilter">

<property name="authenticationEntryPoint" ref="authenticationEntryPoint"/>
<property name="accessDeniedHandler" ref="accessDeniedHandler"/>
<bean/>
<bean id="authenticationEntryPoint"
class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
<property name="loginFormUrl" value="/login.jsp"/>
</bean>
<bean id="accessDeniedHandler"
	class="org.springframework.security.web.access.AccessDeniedHandlerImpl">
<property name="errorPage" value="/accessDenied.htm"/>

###14.2.1 AuthenticationEntryPoint

当你访问一个收保护的资源而没有认证时,AuthenticationEntryPoint就会被调用.此时你希望调用的是LoginUrlAuthenticationEntryPoint,它会重定向到不同的url中.

###14.2.2 AccessDeniedHandler

有时已认证的用户会访问被保护的资源会失败.例如,一个user的用户访问admin的资源,有时是直接用html连接,有时是restful的参数问题.通常需要在web层验证,或在服务层的接口固定调用许可.

如果一个AccessDeniedException被抛出,如果用户已被认证,那么ExceptiontranslationFilter会启用第二种方案,AccessDeniedHandler.一般它会返回403的状态码,另外你可以指定一个错误页面.它可以是简单的"access denied"页面,也可以是jsp,还可以实现自己的接口.

你也可以实现一个自定义的AccessDeniedHandler.

###14.2.3 SavedRequest and the RequestCache Interface 异常转化器的另一个职责是在调用AuthenticationEntryPoint之前保存当前请求.当用户被认证之后,它允许请求重置.典型的例子,如表单登陆.一般它可以通过SavedRequestAwareAuthenticationSuccessHandler进行重定向.

RequestCache的一个作用就是存储和恢复HttpServletRequest实例.当HttpSessionRequestCache被使用时,它会在httpSession中存储请求.RequestCacheFilter的工作就是从缓存中取出已保存的请求,并将它们重定向到原来的url中.

##14.3 SecurityContextPersistenceFilter 基本配置如下:

<bean id="securityContextPersistenceFilter"
class="org.springframework.security.web.context.SecurityContextPersistenceFilter"/>

它的职责是存储http请求之间的securityContext内容,并在请求完成之后清空SecurityContextHolder.如果不清空ThreadLocal,当它被容器线程池回收时,关于用户的上下文信息就会一直储存.这个线程可能会在以后的阶段使用错误的认证信息继续执行.

14.3.1 SecurityContextRepository

spring security 3.0,负载和存储security上下文是由一个单独的策略接口完成的:

public interface SecurityContextRepository{
	SecurityContext loadContext(HttpRequestResponseHolder requestResponseHodler);
	void saveContext(SecurityContext context,HttpServletRequest,request,HttpServletResponse response);
}

HttpRequestResponseHolder,包含了到来的请求和返回信息,并替换他们.它返回的内容会通过拦截链.

其默认实现是HttpSessionSecurityContextRepository,它将security上下文作为httpSesion的一个属性来存储.重要属性,allowSessionCreation,默认值是true.它允许类在需要存储认证用户上下文时来创建一个session.(只有当认证发生,且上下文内容改变才创建).如果你不想创建session,你需要将属性设为false.

<bean id="securityContextPersistenceFilter"
	class="org.springframework.security.web.context.SecurityContextPersistenceFilter">
<property name='securityContextRepository'>
	<bean class='org.springframework.security.web.context.HttpSessionSecurityContextRepository'>
	<property name='allowSessionCreation' value='false' />
	</bean>
</property>
</bean>

另外,你也可使用一个NullSecurityContextRepository的实例,一个空的对象实现.这样会阻止安全上下文存储.即使session已经存在. ##14.4 UsernamePasswordAuthenticationFilter form-login元素的配置,有三个方面需要配置

  • 在loginUrlAuthenticationEntryPoint配置登陆页的url.就像之前一样,并在ExceptionTranslationFilter中设置

  • 实现登陆页(使用 jsp或mvc控制器)

  • 在应用上下文中配置UsernamePasswordAuthenticationFilter的实例

  • 在你的拦截器代理中添加拦截器bean(认真排序)

登陆表单包含username和password两个字段,默认路径是URl.基本的拦截器配置如下:

<bean id="authenticationFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
<property name="authenticationManager" ref="authenticationManager"/>
</bean>

###14.4.1 认证成功或失败的流向

成功或失败都是有AuthenticationSuccessHandler或AuthenticationFailureHandler策略接口分别决定的.现在有SimpleUrlAuthenticationSuccessHandler,SaveRequestAwareAuthenticationSuccessHandler,SimpleUrlAuthenticationFailureHandler,ExceptionMappingAuthenticationFailureHandler and DelegatingAuthenticationFailureHandler.可以查看文档了解更多.

如果认证成功,则AuthenticationSuccessHandler会调用,并重定向到合适的目的地.默认是使用SavedRequestAwareAuthenticationSuccessHandler,登陆成功后会重定向到原始目的地.

© 著作权归作者所有

共有 人打赏支持
流光韶逝
粉丝 19
博文 97
码字总数 126606
作品 0
济南
程序员
【Spring Security】基本原理(一)

介绍 SpringSecurity核心功能:认证(身份校验,你是谁),授权(你能干什么),攻击防护(防止伪造身份) 原理 REST API:相当于应用的controller,用户的增删该查的一些服务 Spring Secur...

zlt995768025
04/29
0
0
spring security2.X 添加验证码

ps:这个是spring security 2.x适用! 如何搭建struts2+hibernate+spring+spring security ,可以看我以前写的一篇文章:http://my.oschina.net/BeyondBit/blog/64465 今天我们来介绍一下sprin...

Beyond-Bit
2013/02/18
0
0
《Spring Security3》第二章第二部分翻译

三步之内使我们的应用变得安全 尽管Spring Security的配置可能会很难,但是它的作者是相当为我们着想的,因为他们为我们提供了一种简单的机制来使用它很多的功能并可以此作为起点。以这个为起...

小样
2012/03/07
0
0
spring security

Spring Security 为基于 J2EE 企业应用软件提供了全面安全服务。安全主要包括两个操作“认证”与“验证”(有时候也会叫做权限控制)。“认证”是为用户建立一个其声明的角色的过程,这个角色...

peiquan
07/04
0
0
敬献Spring Security-3.x官方文档中文版

因机房被封,网站暂时无法访问,请耐心等待,诚心祷告早日恢复。 Spring Security-3.x新近发布,整体的项目结构和包名都出现了天翻地覆的变化,与此同时,Spring Security-3.x中也提供了ses...

hans汉斯
2010/01/21
0
0
SpringBoot集成Spring Security(4)——自定义表单登录

通过前面三篇文章,应该大致了解了Spring Security的流程。你应该发现了,真正的登录请求是由Spring Security帮我们处理的,那么我们如何实现自定义表单登录呢,比如添加一个验证码… 源码地...

yuanlaijike
05/09
0
0
敬献Spring Security-3.x官方文档中文版

因机房被封,网站暂时无法访问,请耐心等待,诚心祷告早日恢复。 Spring Security-3.x新近发布,整体的项目结构和包名都出现了天翻地覆的变化,与此同时,Spring Security-3.x中也提供了ses...

hans汉斯
2010/01/21
0
1
Spring Security4实战与原理分析视频课程( 扩展+自定义)

Spring Security概述与课程概要介绍 Spring Security快速入门(基于XML) Spring Security快速入门(基于XML) URL匹配详解 自定义登陆 配置退出 Ajax登陆退出 JDBC认证 层级角色关系 认证体...

刘宗泽
06/26
0
0
安全的复杂之处:安全web请求的架构

借助于Spring Security的强大基础配置功能以及内置的认证功能,我们在前面讲述的三步配置是很快就能完成的;它们的使用是通过添加auto-config属性和http元素实现的。 但不幸的是,应用实现的...

bigYuan
2014/12/04
0
0
使用 Spring Security 保护 Web 应用的安全 转载

在 Web 应用开发中,安全一直是非常重要的一个方面。安全虽然属于应用的非功能性需求,但是应该在应用开发的初期就考虑进来。如果在应用开发的后期才考虑安全的问题,就可能陷入一个两难的境...

小样
2012/08/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

打印斐波那契数

package com.jerry.ch04;public class PrintFibonacci {public static void main(String[] args) {for (int i=0; i<10; i++) {System.out.print(fib(i) + " ");}......

JerryNing
7分钟前
0
0
shell编程

一、shell脚本介绍

人在艹木中
8分钟前
0
0
istio 0.8 遥测 案例

==============遥测===================================== 演示如何从网格中收集遥测信息。 分布式跟踪。如何配置代理以向Zipkin或Jaeger发送跟踪请求 收集度量标准和日志。此任务说明如何配...

xiaomin0322
10分钟前
0
0
ND4J求多元线性回归以及GPU和CPU计算性能对比

上一篇博客《梯度下降法求多元线性回归及Java实现》简单了介绍了梯度下降法,并用Java实现了一个梯度下降法求回归的例子。本篇博客,尝试用dl4j的张量运算库nd4j来实现梯度下降法求多元线性回...

冷血狂魔
11分钟前
0
0
springboot常用注解

@SpringBootApplication: 包含@Configuration、@EnableAutoConfiguration、@ComponentScan 通常用在主类上。 @Service: 用于标注业务层组件。 @RestController: 用于标注控制层组件(如strut...

GoldenVein
17分钟前
1
0
如何进行大数据的入门级学习?

不知道你是计算机专业应届生还是已经从业者。总之,有java基础的学生学习大数据会轻松很多,零基础的小白都需要从java和linux学起。 如果你是一个学习能力特别强,而且自律性也很强的人的话可...

董黎明
31分钟前
0
0
使用Parcelable传递复杂参数

最近做AIDL传递对象,对象必须实现Parcelable的方法才可以被传递。 @Override    public int describeContents() {//这个 默认返回0就行了。        return 0;    }    ...

火云
32分钟前
0
0
十大Intellij IDEA快捷键

Intellij IDEA中有很多快捷键让人爱不释手,stackoverflow上也有一些有趣的讨论。每个人都有自己的最爱,想排出个理想的榜单还真是困难。以前也整理过Intellij的快捷键,这次就按照我日常开发...

HJCui
42分钟前
0
0
word 使用mathtype 编写 数学公式

下载安装,这个链接命名。。。。 http://www.mathtype.cn/xiazai.html 安装之后会多出一个选项 使用内联方式插入图表 编写公式的界面 设置支持latex 语法 输入公式回车就可以看到结果...

阿豪boy
今天
0
0
Promise

定义 Promise是异步编程的一种解决方案,所谓Promise就是一个容器,里面保存着某个未来才会结束的事件(通常是一个一步操作)的结果。 特点: 2.1 对象的状态不受外界影响,三种状态pending...

litCabbage
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部