`
kalashnicov
  • 浏览: 52598 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

spring security 2中使用通过自定义过滤器实现多登录页面

    博客分类:
  • Java
阅读更多

最近在应用Spring Security的时候,积累了一些心得,写出来希望能给需要的人一些启示,毕竟网上对于spring security的配置和应用不是很多,大多是一些介绍acegi应用老文章。希望大家提出宝贵意见。此文的相应设置适用于spring security2.x。


Spring Security相对于Acegi在配置上方便了很多,具体的参考文档在http://www.family168.com/tutorial/springsecurity/html/springsecurity.html 上有中文翻译。

至于Spring Security的具体配置和应该可以从downpour的http://www.iteye.com/topic/319965一岾中学习。

在此我想写的是有关于multiple login pages的情况。


参考文章:san586的http://ss3ex.iteye.com/blog/452307



问题:
对于多登录界面,要求实现不同的用户,比如前台用户和后台用户,分别在以下情况中实现到不同页面的转向:

  1.在未登录时,访问受限页面

  2.在登录以后,转向到不同的默认页面,比如前台用户转向到个人中心主页,后台用户转向到后台管理页面的首页。

  3.在登录失败时,导向到错误页面。

  4.在注销登录时,不同的用户转向到不同的注销成功界面。


由于Spring Security的核心是基于Spring基础之上的各种过滤器组成的链,而且规定,这些过滤器的顺序不可更改,其中一些元素自己使用而创建出的过滤器如HttpSessionContextIntegrationFilter, ExceptionTranslationFilter 或 FilterSecurityIntercepto 是不允许替换成自己所定义的过滤器的。


我们可以把自己的过滤器添加到队列中,使用custom-filter元素,使用这些名字中的一个,来指定自定义过滤器应该出现的位置:

<beans:bean id="myFilter" class="com.mycompany.MySpecialAuthenticationFilter">  
    <custom-filter position="AUTHENTICATION_PROCESSING_FILTER"/>  
</beans:bean>  

 
position属性可以有before,position(对原来的过滤器进行替换),after等,后面的位置表示过滤器的位置。


在针对以上多登录界面的情况中的几个问题,downpour的一贴中给出了一种解决方案,是通过将session中设定标识,然后把转发的目标设定为action,在action中根据请求中的标识来进行发送到相应的页面。除了这种方法之外,跟据spring security的实现机理,我们完全可以通过实现自己的过滤器对来自不同用户的请求进行相应处理。


在进行表单认证的时候,AuthenticationProcessingFilter是验证执行机制的过滤器,通过对其的继承可以实现自定义的处理过程,出于减少编码量的考虑,我们可以在验证时配置两个AuthenticationProcessingFilter的实例,分别设置不同的filterprocessedurl来响应不同的请求,例如

	<!-- 验证前台用户 -->
	<bean id="preLoginFilter"
		class="org.springframework.security.ui.webapp.AuthenticationProcessingFilter">
		<sec:custom-filter before="AUTHENTICATION_PROCESSING_FILTER" />
		<property name="authenticationManager" ref="authenticationManager" />
		<property name="authenticationFailureUrl" value="/Seeworld/html" />
		<property name="defaultTargetUrl" value="/" />
		<property name="alwaysUseDefaultTargetUrl" value="true" />
		<property name="filterProcessesUrl" value="/j_spring_security_check" />
	</bean>
	<!-- 验证后台用户 -->
	<bean id="adminLoginFilter"
		class="org.springframework.security.ui.webapp.AuthenticationProcessingFilter">
		<sec:custom-filter position="AUTHENTICATION_PROCESSING_FILTER" />
		<property name="authenticationManager" ref="authenticationManager" />
		<property name="filterProcessesUrl" value="/back/j_spring_security_check" />
		<!-- 认证错误页面,已经被覆盖,由urlStrategy决定-->
		<property name="authenticationFailureUrl" value="/admin/login/login.html?error" />
		<!-- 认证成功页面-->
		<property name="defaultTargetUrl" value="/admin/web/main.html" />
		<property name="alwaysUseDefaultTargetUrl" value="true" />
	</bean>
 

 


通过对于两个过滤器的相关属性的不同配置,可以分别响应不同的请求,并定向到相应的页面,如上例,前台页面的登陆请求发送到/j_spring_security_check,而后台发送到/back/j_spring_security_check,根据认证的结果分别转到到相应的

defaultTargetUrl或者authenticationFailureUrl。相应的logoutfilter也可以如此实现,通过这四个过滤器,我们可解决

以上问题中的2,3,4对于不同用户的登录和注销进行了相应处理。

<!-- 注销过滤器,完成前台用户注销时的定向功能 -->
	<bean id="preLogoutFilter" class="org.springframework.security.ui.logout.LogoutFilter">
		<sec:custom-filter before="LOGOUT_FILTER" />
		<constructor-arg value="/" />
		<constructor-arg>
			<list>
				<bean
					class="org.springframework.security.ui.logout.SecurityContextLogoutHandler" />
			</list>
		</constructor-arg>
		<property name="filterProcessesUrl" value="/j_spring_security_logout" />
	</bean>
	<!-- 注销过滤器,完成后台管理员注销时的定向功能 -->
	<bean id="adminLogoutFilter" class="org.springframework.security.ui.logout.LogoutFilter">
		<sec:custom-filter position="LOGOUT_FILTER" />
		<constructor-arg value="/admin/login/login.html" />
		<constructor-arg>
			<list>
				<bean
					class="org.springframework.security.ui.logout.SecurityContextLogoutHandler" />
			</list>
		</constructor-arg>
		<property name="filterProcessesUrl" value="/back/j_spring_security_logout" />
	</bean>

 
而对于问题1,  在downpour的文章中已经有解决,通过实现自己的AthenticationEntryPoint来控制没有登录的用户访问受限的页面。

 

 至此,通过增加几个过滤器的方法,我们可以使用Spring Security2完成对多登录页面的情况的处理,相比以前的Acegi的繁琐配置,SS2的优势不言而喻

2
0
分享到:
评论
2 楼 elbert_li 2012-03-15  
有个疑问,请教下,我现在有多个登录页面对不同的用户,用spring security该如何解决权限管理问题呢~~一共4种类型用户,总不能建4个过滤器吧~~
1 楼 kettas 2011-09-06  
....学习了。

相关推荐

    spring security 4 小例子带自定义过滤器

    spring security 4 小例子带自定义过滤器

    SpringSecurity学习之自定义过滤器的实现代码

    主要介绍了SpringSecurity学习之自定义过滤器的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    Spring Security 文档

    三种是细分角色和权限,并将用户、角色、权限和资源均采用数据库存储,并且自定义过滤器,代替原有的FilterSecurityInterceptor过滤器, 并分别实现AccessDecisionManager、...

    动力节点最新SpringSecurity框架教程配套资料分享

    安全入门,认证授权的概念,在SpringBoot中使用Security,加密处理,基于数据库的认证和授权,Spring Security中使用Thymeleaf自定义登录页面,通过过滤器集成图片验证码,Base64和JWT的学习,使用JWT实现认证登录...

    使用Spring+SpringSecurity+SpringMVC的web框架小demo

    这个是基于Spring的一个小例子 , 主要是为了帮助大家学习SpringSecurity和SpringMvc, 1.不用再数据库建表, ...4.如果不是admin,就跳转到 无权访问页面...还有可以使用自定义的过滤器来实现登录, 有不懂的问题 可以加我

    Spring Security3的使用

    并且自定义过滤器,代替原有的FilterSecurityInterceptor过滤器,并分别实现AccessDecisionManager、 InvocationSecurityMetadataSourceService和UserDetailsService,并在配置文件中进行相应配置。 四是修改spring ...

    spring security 参考手册中文版

    29.2在Spring Security中使用LDAP 221 29.3配置LDAP服务器 221 29.3.1使用嵌入式测试服务器 222 29.3.2使用绑定认证 222 29.3.3加载权限 223 29.4实现类 223 29.4.1 LdapAuthenticator实现 224 通用功能 224 认证者 ...

    最详细Spring Security学习资料(源码)

    Spring Security是一个功能强大且高度可定制的身份验证和授权框架,专门用于保护Java应用程序的...Web集成:Spring Security能够无缝集成到Spring框架和Spring MVC中,提供了过滤器、标签库等工具,简化了权限控制和

    spring3.0+mybatis3.0+springSecurity+SpringMVC

    还有可以使用SpringMVC进行前后台的交互 还有可以使用自定义的过滤器来实现登录, 有不懂的问题 可以加我 5.可以通过表单的方式使用mybatis添加数据库记录 6.使用mvc进行数据渲染 具体演示:...

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

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

    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 Security 中文教程.pdf

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

    SpringAll_wuyouzhuguli.tar.gz

    Spring Boot中使用过滤器和拦截器 Spring Boot整合MyBatis通用Mapper和PageHelper 深入学习Spring Boot自动装配 深入学习Spring Boot中的SpringApplication Spring Boot配合Hibernate Validator参数校验 自定义...

    带验证码的登录功能-基于自定义过滤器-demo

    基于Springboot+SpringSecurity+Mybatis+MySQL+Vue实现的登录功能(带验证码)的demo

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

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

    Spring_Security-3.0.1文档(翻译版

    一种是全部利用配置文件,将用户、权限、...三种是细分角色和权限,并将用户、角色、权限和资源均采用数据库存储,并且自定义过滤器,代替原有的FilterSecurityInterceptor过滤器,并分别实现AccessDecisionManager、

    xmljava系统源码-Spring-Boot-Security-Thymeleaf-Demo:SpringBoot2.0+SrpingSec

    在Thymeleaf中使用Spring Security的标签 自定义权限注解 记住密码功能 如果需要前后端分离的安全框架搭建教程可以参考: 项目演示 如果想要直接体验,直接 clone 项目,运行 mvn spring-boot:run 命令即可进行访问...

    Spring in Action(第二版 中文高清版).part2

    7.4.1 代理Spring Security的过滤器 7.4.2 处理安全上下文 7.4.3 提示用户登录 7.4.4 处理安全例外 7.4.5 强制Web安全性 7.4.6 确保一个安全的通道 7.5 视图层安全 7.5.1 有条件地渲染内容 7.5.2 显示用户...

    Spring攻略(第二版 中文高清版).part2

    6.2 在你的Servlet和过滤器中使用Spring 214 6.2.1 问题 214 6.2.2 解决方案 215 6.2.3 工作原理 215 6.3 将Spring与Struts 1.x集成 220 6.3.1 问题 220 6.3.2 解决方案 220 6.3.3 工作原理 220 6.4...

    Spring攻略(第二版 中文高清版).part1

    6.2 在你的Servlet和过滤器中使用Spring 214 6.2.1 问题 214 6.2.2 解决方案 215 6.2.3 工作原理 215 6.3 将Spring与Struts 1.x集成 220 6.3.1 问题 220 6.3.2 解决方案 220 6.3.3 工作原理 220 6.4...

Global site tag (gtag.js) - Google Analytics