`
kalashnicov
  • 浏览: 52980 次
  • 性别: 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中,我们可以通过自定义过滤器来扩展其功能,以满足特定的安全需求。在这个小例子中,我们将探讨如何创建并集成自定义过滤器,以及它在Spring Security中的工作原理。 首先,我们需要理解Spring...

    spring mvc 和spring security自定义登录

    综上所述,结合Spring MVC和Spring Security实现自定义登录,需要理解两者的基本原理,配置合适的过滤器、认证提供者和授权规则。通过这种方式,我们可以创建一个既安全又易于维护的Web应用程序,为用户提供安全的...

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

    "SpringSecurity学习之自定义过滤器的实现代码" Spring Security学习之自定义过滤器的实现代码主要介绍了Spring Security学习之自定义过滤器的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有...

    springsecurity2 自定义filter实现

    在Spring Security框架中,自定义过滤器是实现特定安全需求的一种常见方式。Spring Security的核心功能是通过一系列的Filter链来处理HTTP请求,这些Filter包括认证、授权等关键操作。本篇我们将深入探讨如何在Spring...

    Spring security 自定义密码加密方式的使用范例。

    1. **Filter Security Chain**:这是Spring Security的核心,一系列过滤器负责拦截请求,执行安全相关的操作。 2. **Authentication Manager**:负责处理用户的认证请求,包括验证用户名和密码。 3. **...

    spring-security实现自定义登录认证.rar

    本资源“spring-security实现自定义登录认证.rar”包含了一个使用Spring Security进行登录认证的示例,以及JWT(JSON Web Tokens)与Spring Security集成的代码。 首先,让我们了解Spring Security的基本工作原理。...

    spring security3.1 实现验证码自定义登录

    总结来说,Spring Security 3.1的验证码自定义登录涉及验证码生成、自定义AuthenticationProvider、配置Spring Security以及可能的过滤器链扩展。这一过程旨在提升系统安全性,防止恶意登录,同时也需要考虑到用户...

    spring security进级篇 V 自定义标签控制显示

    自定义JSP标签的实现分为两个主要步骤:1) 创建标签处理类,2) 在JSP页面中使用标签。处理类通常继承自`TagSupport`或`SimpleTagSupport`,并覆盖其中的方法来实现业务逻辑。然后,在JSP页面中,你可以像使用任何...

    springSecurity 实现传参

    7. **自定义过滤器**:如果你的逻辑更复杂,比如需要在登录成功后执行特定操作,可以创建自定义过滤器并将其插入到Spring Security的过滤器链中。 通过以上步骤,你可以实现Spring Security的登录验证和参数传递...

    Spring Security 3多用户登录实现一

    在本文中,我们将深入探讨如何在Spring Security 3中实现多用户登录功能。首先,我们需要理解Spring Security的基本架构和核心概念。 1. **Spring Security 架构** Spring Security的核心组件包括: - **Filter ...

    SpringBoot集成Spring Security实现异常处理+自定义表单登录使用Filter验证【完整源码+数据库】

    在本项目中,我们主要关注的是如何将Spring Boot与Spring Security进行集成,以实现一个具有异常处理和自定义表单登录验证的安全系统。Spring Security是一个强大的安全框架,它提供了多种安全控制,包括用户认证、...

    Spring Cloud Gateway 整合 Spring Security 统一登录认证鉴权

    通过自定义过滤器,我们可以实现复杂的业务逻辑,比如身份验证和权限控制。 接下来,我们关注Spring Security。它是一个灵活且可扩展的安全框架,支持多种认证和授权机制。在微服务架构中,Spring Security 可以...

    关于ip的过滤器 spring security例子

    在Spring Security的配置类中,我们可以通过`http`方法定义过滤器链,并使用`addFilterBefore`或`addFilterAfter`方法添加自定义过滤器。例如: ```java @Configuration @EnableWebSecurity public class Security...

    springboot springsecurity动态权限控制

    - 如果默认的过滤器不能满足需求,可以编写自定义过滤器,插入到Spring Security的过滤器链中,实现更复杂的逻辑,比如基于URL、方法或自定义条件的权限控制。 5. **JWT令牌**: - 为了支持API的无状态认证,可以...

    Spring Security 2 中文参考文档(chm)

    Spring Security的核心是Filter Security Interceptor(FSI)和Filter Chain Proxy(FCP),它们构成了过滤器链。当HTTP请求到达时,这些过滤器会检查请求并执行相应的安全策略。例如,BasicAuthenticationFilter...

    Spring Security 资料合集

    - 在Spring Boot项目中,Spring Security 可以通过自动配置快速启动,开发者只需少量配置就能实现复杂的安全需求。 这三份资料——"实战Spring Security 3.x.pdf"、"Spring Security 3.pdf" 和 "Spring Security...

    spring+security+11种过滤器介绍.doc

    4. DefaultLoginPageGeneratingFilter:此过滤器的作用是生成一个默认的登录页面,用户可以通过访问/spring_security_login来访问这个页面。这对于快速搭建一个基本的登录界面非常有用,但如果你需要自定义登录界面...

    SpringSecurity笔记,编程不良人笔记

    - **Filter Chain**: SpringSecurity通过一系列过滤器实现其安全功能,这些过滤器构成了Filter Chain。每个过滤器负责特定的安全任务,如认证、授权等。 - **Authentication**: 表示用户的身份信息,包括用户名、...

Global site tag (gtag.js) - Google Analytics