`

Spring_Security_多页面登录配置教程

    博客分类:
  • java
 
阅读更多
本文转自百度文库:http://wenku.baidu.com/view/425b9b11cc7931b765ce1527.html
Spring Security 多页面登录配置教程
2010-07-05 12:45
SHOP++采用了著名的Spring Security框架技术作为站点权限的认证管理,下面就简要讲解一下多页面登录的配置方式。
(注意:本教程基于spring-security2.0.5版本,其它版本配置方式可能有所区别)

对于Spring-Security的基本配置这里就不作详细介绍了,大家可以参考一下SHOP++源代码。现在网上流传的spring-security配置教程大多都是基于单一登陆模式进行讲解,这与国内普遍应用并不相符,现在国内流行的商城系统、CMS系统、论坛系统基本上都是采用前台与后台分开的登录模式。下面为Spring-security多登录页面模式的配置:

一、配置两个AuthenticationProcessingFilter实例,分别设置两个不同的filterProcessedUrl来处理前后台的请求,这里就完成了登录的成功跳转、失败跳转的配置,实例代码如下:

<!-- filterProcessesUrl 登录处理URL -->
<!-- defaultTargetUrl 登录成功后跳转的默认URL -->
<!-- authenticationFailureUrl 登录失败后跳转的URL -->
<!-- alwaysUseDefaultTargetUrl 是否登录后必须访问default-target-url -->

<!-- 前台用户登陆 -->
<bean id="shopLoginFilter" class="org.springframework.security.ui.webapp.AuthenticationProcessingFilter">
<sec:custom-filter before="AUTHENTICATION_PROCESSING_FILTER" />
<property name="authenticationManager" ref="authenticationManager" />
<property name="filterProcessesUrl" value="/shop/login_action" />
<property name="defaultTargetUrl" value="/shop/member!loginSuccess.action" />
<property name="authenticationFailureUrl" value="/shop/member!loginError.action" />
<property name="alwaysUseDefaultTargetUrl" value="true" />
</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="/admin/login_action" />
<property name="defaultTargetUrl" value="/admin/admin!loginSuccess.action" />
<property name="authenticationFailureUrl" value="/admin/admin!loginError.action" />
<property name="alwaysUseDefaultTargetUrl" value="true" />
</bean>


二、对于前后台的注销处理,需要配置两个AuthenticationProcessingFilter实例,分别设置两个不同的filterProcessesUrl来处理前后台的请求,这里就完成了注销后跳转的配置,实例代码如下:

<!-- filterProcessesUrl 注销处理URL -->
<!-- c*****tructor-arg 注销后跳转URL -->
<!-- 前台用户注销 -->

<bean id="shopLogoutFilter" class="org.springframework.security.ui.logout.LogoutFilter">
<sec:custom-filter before="LOGOUT_FILTER" />
<c*****tructor-arg value="/" />
<c*****tructor-arg>
   <list>
    <bean class="org.springframework.security.ui.logout.SecurityContextLogoutHandler" />
   </list>
</c*****tructor-arg>
<property name="filterProcessesUrl" value="/shop/logout_action" />
</bean>

<!-- 后台用户登陆注销 -->  
<bean id="adminLogoutFilter" class="org.springframework.security.ui.logout.LogoutFilter">
<sec:custom-filter position="LOGOUT_FILTER" />
<c*****tructor-arg value="/admin/admin!login.action" />
<c*****tructor-arg>
   <list>
    <bean class="org.springframework.security.ui.logout.SecurityContextLogoutHandler" />
   </list>
</c*****tructor-arg>
<property name="filterProcessesUrl" value="/admin/logout_action" />
</bean>


三、最后我们只需要配置未登录用户的跳转URL即可,这里我们需重新配置authenticationProcessingFilterEntryPoint,让所有未登录请求都统一跳转到一个Action(或JSP)上,再由此Action根据SavedRequest对象跳转到相应的登录URL(SavedRequest对象是spring-security保存登陆请求信息的对象,可使用getSession("SPRING_SECURITY_SAVED_REQUEST_KEY")方式获取)。

<!-- 将auto-config设置为false, 并配置entry-point-ref。-->
<sec:http auto-config="false" entry-point-ref="authenticationProcessingFilterEntryPoint">

<!-- 配置无需进行权限验证的路径 -->
<sec:intercept-url pattern="/shop/member!login.action" filters="none" />
<sec:intercept-url pattern="/shop/member!loginError.action" filters="none" />
<sec:intercept-url pattern="/admin/admin!login.action" filters="none" />
<sec:intercept-url pattern="/admin/admin!loginError.action" filters="none" />
</sec:http>

<!-- loginFormUrl为前后台统一处理未登录请求的Action地址 -->
<bean id="authenticationProcessingFilterEntryPoint" class="org.springframework.security.ui.webapp.AuthenticationProcessingFilterEntryPoint">
<property name="loginFormUrl" value="/shop/user!login.action" />
</bean>

Action处理代码:

public String login() {
// 从Session中获取SavedRequest对象,并根据请求URL判断是否为后台请求,再跳转到相应登录URL
SavedRequest savedRequest = (SavedRequest) getSession("SPRING_SECURITY_SAVED_REQUEST_KEY");
if (savedRequest != null && savedRequest.getRequestUrl().indexOf("/admin/") >= 0) {
   // 跳转到后台登录页面
   return "adminLoginAction";
} else {
   // 跳转到前台登录页面
   return "shopLoginAction";
}
}

对于spring-security的多页面登录还有一些其它的解决方法,就代码量与维护性来说,推荐大家采用以上方法。以上为SHOP++技术教程,来源http://www.shopxx.net。





1.HttpSessionContextIntegrationFilter


/j_spring_security_check,提交登陆信息的URL地址。

自定义form时,要把form的action设置为/j_spring_security_check。注意这里要使用绝对路径,避免登陆页面存放的页面可能带来的问题。

j_username,输入登陆名的参数名称。

j_password,输入密码的参数名称

_spring_security_remember_me,选择是否允许自动登录的参数名称。

可以直接把这个参数设置为一个checkbox,无需设置value,Spring Security会自行判断它是否被选中。

--------------------------------------------------------------------------------------------

4.DefaultLoginPageGeneratingFilter


此过滤器用来生成一个默认的登录页面,默认的访问地址为/spring_security_login,这个默认的登录页面虽然支持用户输入用户名,密码,也支持rememberMe功能,但是因为太难看了,只能是在演示时做个样子,不可能直接用在实际项目中。


自定义登陆页面

<http auto-config='true'>
    <intercept-url pattern="/login.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" />
    <intercept-url pattern="/**" access="ROLE_USER" />
    <form-login login-page="/login.jsp"
                authentication-failure-url="/login.jsp?error=true"
                default-target-url="/" />
</http>

--------------------------------------------------------------------------------------------

5.BasicProcessingFilter


此过滤器用于进行basic验证,功能与AuthenticationProcessingFilter类似,只是验证的方式不同。

添加basic认证,去掉auto-config="true",并加上<http-basic />

<http auto-config="true">
    <http-basic />
    <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" />
    <intercept-url pattern="/" access="ROLE_USER" />
</http>
---------------------------------------------------------------------------------------------

6.SecurityContextHolderAwareRequestFilter


此过滤器用来包装客户的请求。目的是在原始请求的基础上,为后续程序提供一些额外的数据。比如getRemoteUser()时直接返回当前登陆的用户名之类的。

---------------------------------------------------------------------------------------------

7.RememberMeProcessingFilter


此过滤器实现RememberMe功能,当用户cookie中存在rememberMe的标记,此过滤器会根据标记自动实现用户登陆,并创建SecurityContext,授予对应的权限。

在配置文件中使用auto-config="true"就会自动启用rememberMe

实际上,Spring Security中的rememberMe是依赖cookie实现的,当用户在登录时选择使用rememberMe,系统就会在登录成功后将为用户生成一个唯一标识,并将这个标识保存进cookie中,我们可以通过浏览器查看用户电脑中的cookie。

---------------------------------------------------------------------------------------------

8.AnonymousProcessingFilter

为了保证操作统一性,当用户没有登陆时,默认为用户分配匿名用户的权限。

在配置文件中使用auto-config="true"就会启用匿名登录功能。在启用匿名登录之后,如果我们希望允许未登录就可以访问一些资源,可以在进行如下配置。

<http auto-config='true'>
    <intercept-url pattern="/" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" />
    <intercept-url pattern="/**" access="ROLE_USER" />
</http>

设置成 ROLE_ANONYMOUS 也可以。


<http auto-config='true'>
    <intercept-url pattern="/" filters="none" />
    <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" />
    <intercept-url pattern="/**" access="ROLE_USER" />
</http>

filters="none"表示当我们访问“/”时,是不会使用任何一个过滤器去处理这个请求的,它可以实现无需登录即可访问资源的效果,但是因为没有使用过滤器对请求进行处理,所以也无法利用安全过滤器为我们带来的好处,最简单的,这时SecurityContext内再没有保存任何一个权限主体了,我们也无法从中取得主体名称以及对应的权限信息。

---------------------------------------------------------------------------------------------

9.ExceptionTranslationFilter


此过滤器的作用是处理中FilterSecurityInterceptor抛出的异常,然后将请求重定向到对应页面,或返回对应的响应错误代码。

---------------------------------------------------------------------------------------------

10.SessionFixationProtectionFilter


防御会话伪造攻击。

解决session fix的问题其实很简单,只要在用户登录成功之后,销毁用户的当前session,并重新生成一个session就可以了。

<http auto-config='true' session-fixation-protection="none">
    <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" />
    <intercept-url pattern="/**" access="ROLE_USER" />
</http>


session-fixation-protection的值共有三个可供选择,none,migrateSession和newSession。默认使用的是migrationSession
---------------------------------------------------------------------------------------------

11.FilterSecurityInterceptor


用户的权限控制都包含在这个过滤器中。

功能一:如果用户尚未登陆,则抛出AuthenticationCredentialsNotFoundException“尚未认证异常”。

功能二:如果用户已登录,但是没有访问当前资源的权限,则抛出AccessDeniedException“拒绝访问异常”。

功能三:如果用户已登录,也具有访问当前资源的权限,则放行。

位于过滤器顶端,第一个起作用的过滤器。


用途一,在执行其他过滤器之前,率先判断用户的session中是否已经存在一个SecurityContext了。如果存在,就把SecurityContext拿出来,放到SecurityContextHolder中,供Spring Security的其他部分使用。如果不存在,就创建一个SecurityContext出来,还是放到SecurityContextHolder中,供Spring Security的其他部分使用。


用途二,在所有过滤器执行完毕后,清空SecurityContextHolder,因为SecurityContextHolder是基于ThreadLocal的,如果在操作完成后清空ThreadLocal,会受到服务器的线程池机制的影响。

--------------------------------------------------------------------------------------------

2.LogoutFilter


只处理注销请求,默认为/j_spring_security_logout。


用途是在用户发送注销请求时,销毁用户session,清空SecurityContextHolder,然后重定向到注销成功页面。可以与rememberMe之类的机制结合,在注销的同时清空用户cookie。

--------------------------------------------------------------------------------------------

3.AuthenticationProcessingFilter


处理form登陆的过滤器,与form登陆有关的所有操作都是在此进行的。

默认情况下只处理/j_spring_security_check请求,这个请求应该是用户使用form登陆后的提交地址,form所需的其他参数可以参考:



此过滤器执行的基本操作时,通过用户名和密码判断用户是否有效,如果登录成功就跳转到成功页面(可能是登陆之前访问的受保护页面,也可能是默认的成功页面),如果登录失败,就跳转到失败页面。

<form action="${pageContext.request.contextPath}/j_spring_security_check" style="width:260px;text-align:center;">
<fieldset>
    <legend>登陆</legend>
    用户: <input type="text" name="j_username" style="width:150px;" value="${sessionScope['SPRING_SECURITY_LAST_USERNAME']}"/><br />
    密码: <input type="password" name="j_password" style="width:150px;" /><br />
    <input type="checkbox" name="_spring_security_remember_me" />两周之内不必登陆<br />
    <input type="submit" value="登陆"/>
    <input type="reset" value="重置"/>
</fieldset>
</form>
分享到:
评论

相关推荐

    spring_security3教程

    在这个3.x版本的教程中,我们将深入了解如何配置和使用Spring Security。 首先,我们需要创建一个Web项目并导入必要的库。这通常包括Spring Security的核心库和其他Spring框架的依赖。确保在项目构建路径中包含了...

    Spring_Security入门demo(maven项目)

    **Spring Security 入门教程** Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,用于保护基于Java的应用程序。在这个"Spring_Security入门demo(maven项目)"中,我们将探讨如何搭建一个基本的...

    Spring_Security-3.0.1_中文自学教程.pdf

    ### Spring Security 3.0.1 中文自学教程知识点概览 #### 一、Spring Security 简介 ##### 1.1 Spring Security 是什么? Spring Security 是一款强大的、高度可定制的身份验证与授权框架。它能够帮助开发者保护...

    spring_security3入门教程实例

    本入门教程将引导你逐步了解如何设置并运行一个基于Spring Security 3.x的简单Web项目。我们将从项目的初始化、配置文件的设置,到具体的权限控制和认证流程进行讲解。 首先,你需要创建一个新的Web项目,并导入...

    spring_security3详细教程

    8. **国际化支持**:Spring Security 3 支持多语言,可以方便地为错误消息和登录页面提供不同的语言版本。 9. **集成Spring MVC**:Spring Security 3 非常适合与Spring MVC一起使用,通过`@Secured`、`@...

    Spring3_Security中文教程

    这份教程将帮助读者理解Spring Security的基本概念、配置方法和实践技巧,从而在实际项目中有效实施安全策略。 总的来说,Spring Security是一个强大的安全框架,它为企业级应用提供了全面的安全保障。通过理解和...

    Spring_Security_2.0.x中文参考文档

    - 提供了一个简单的教程示例,帮助用户快速上手 Spring Security。 - **Contacts 示例** - 一个关于联系人管理系统的示例,展示了如何在实际应用中使用 Spring Security。 - **LDAP 示例** - 使用 LDAP(轻量级...

    spring Security3中文教程,经典的

    ### Spring Security3中文教程知识点概览 #### 一、安全核心概念与起步 Spring Security是Spring框架中的一个重要组成部分,主要用于为Web应用提供安全防护。它不仅提供了强大的认证和授权功能,还支持各种加密...

    Spring Security 3多用户登录实现一

    **Spring Security 3 多用户登录实现详解** Spring Security 是一个强大的、高度可定制的身份验证和访问控制框架,广泛应用于Java EE平台上的安全解决方案。在本文中,我们将深入探讨如何在Spring Security 3中实现...

    spring security3配置和使用实例+教程

    教程文档`教你使用_SpringSecurity_3.0_52页.pdf`会详细指导你如何一步步配置和使用Spring Security。它应该包含了配置文件的示例、如何集成到Spring应用中、如何创建自定义认证逻辑以及如何进行授权设置等内容。...

    Spring Security 中文教程.pdf

    ### Spring Security 中文教程知识点概览 #### 一、Spring Security简介 - **Spring Security**是一种全面的安全服务框架,主要用于基于J2EE的企业应用程序。它与Spring框架紧密结合,旨在简化安全性的实现,使得...

    spring-security3入门教程

    本入门教程将带你深入了解 Spring Security 3 的核心概念、配置以及实际应用。 1. **核心概念** - **身份验证**:Spring Security 提供了多种方式来验证用户身份,如用户名/密码登录、LDAP 集成、OAuth2 认证等。...

    spring security教程

    本教程是基于Mossle平台整理的Spring Security入门资料,旨在帮助初学者快速掌握这一关键的安全技术。 首先,我们要理解Spring Security的核心概念。**认证**是验证用户身份的过程,通常涉及用户名和密码的输入。**...

    狂神spring-security静态资源.zip

    这个"狂神spring-security静态资源.zip"文件很可能包含了Spring Security的相关教程、代码示例或配置文件,帮助用户理解和学习如何在Spring应用中实现安全控制。下面我们将深入探讨Spring Security的核心概念、功能...

    Spring Security 基本使用和配置代码

    本教程将深入探讨Spring Security的基本使用和配置代码,帮助你理解和实践这个框架。 首先,Spring Security的核心功能包括用户身份验证、权限控制以及安全相关的会话管理。在开始配置之前,确保你的项目已经集成了...

    spring security3 开发手册

    为了满足不同的界面需求,Spring Security允许实现自定义登陆页面。用户可以修改配置文件,配置登陆页面的参数,测试和优化登陆流程。 #### 单点登录(SSO) 单点登录是企业级应用中非常重要的功能。Spring ...

    Spring Security 3.x 完整入门教程 源代码

    9. **国际化的提示信息**:Spring Security 允许你配置多语言提示信息,以适应不同地区的用户。 10. **MyEclipse工程**:这个教程源代码是用MyEclipse开发环境创建的,意味着你可以导入工程并直接运行,便于学习和...

    SpringSecurity 中文文档+简单视频教程

    1. **SpringSecurity架构**:SpringSecurity基于过滤器链的设计,包括了多个核心过滤器,如`DelegatingFilterProxy`、`ChannelProcessingFilter`、`HttpSessionAuthenticationStrategy`等,它们协同工作来处理请求的...

    SpringSecurity素材.rar

    8. **错误处理与安全日志**:介绍如何定制SpringSecurity的错误页面,以及如何配置日志记录以监控安全相关的事件。 9. **OAuth2整合**:如果视频内容深入,可能会涉及到如何集成SpringSecurity与OAuth2服务提供商,...

Global site tag (gtag.js) - Google Analytics