`
113.com
  • 浏览: 80121 次
  • 来自: 广州
社区版块
存档分类
最新评论

Spring Security 3.0 多页面登录配置

 
阅读更多

Spring Security 3.0 多页面登录配置  

 http://zhousl.koo.blog.163.com/blog/static/7136380420113208174680/

 

网上很多文章是关于Spring Security 2实现多页面登录的。因为现在需要使用Spring Security 3.x来实现所以只能自己动手解决。参考了网上这两篇文章《spring security 2中使用通过自定义过滤器实现多登录页面》《spring security 全配置》。总的来说Security 2 和 3还是有不小差别的。

      现在开始进入正题。同样使用《spring security 2中使用通过自定义过滤器实现多登陆页面》中的那几个问题。

      问题:

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

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

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

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

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

     第一个问题,因为Spring Security会通过AuthenticationEntryPoint来实现未登录用户访问被保护资源时自动跳转到登录页面,所以我们这里需要的就是扩展AuthenticaitonEntryPoint。

     首先修改配置文件,如下:

     <http entry-point-ref="loginPageEntryPoint">
        <intercept-url pattern="/login.**" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
        <intercept-url pattern="/admin/login.**" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
        <intercept-url pattern="/admin/**" access="ROLE_ADMIN"/>
        <intercept-url pattern="/**" access="ROLE_USER"/>

         ……

     <beans:bean id="loginUrlEntryPoint" class="cn.csdn.blog.loafap.security.LoginUrlEntryPoint"></beans:bean>

   

     注意<http> 的配置,因为我们要通过自定义过滤器来实现,所以这里去掉auto-config="true"这个属性。

     LoginUrlEntryPoint.java内容如下:

     public class LoginUrlEntryPoint implements AuthenticationEntryPoint {

         public void commence(HttpServletRequest request, HttpServletResponse response,
                   AuthenticationException authException) throws IOException, ServletException {
             String targetUrl = null;
             String url = request.getRequestURI();
        
             if(url.indexOf("admin") != -1){
                 //未登录而访问后台受控资源时,跳转到后台登录页面
                 targetUrl = "/admin/login.jsp";
             }else{
                 //未登录而访问前台受控资源时,跳转到前台登录页面
                 targetUrl = "/login.jsp";
             }
        
             targetUrl = request.getContextPath() + targetUrl;
             response.sendRedirect(targetUrl);
         }

     }

     以上就实现了问题一的解决。

     第二、三问题, 在进行表单认证的时候,UsernamePasswordAuthenticationFilter 是验证执行机制的过滤器,这与Spring Security2.x 不同,spring security2.x 用的是AuthenticationProcessingFilter 过滤器。在Spring Security3.x中已不推荐使用AuthenticationProcessingFilter 过滤器啦。这里我们对比Spring Security2.x来看看。

     Spring Security 2.x的配置:

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

           <property name="filterProcessesUrl" value="/admin/login" /> 
      </bean>

      Spring Security 3.x的配置:

      <!-- 验证前台用户 -->  
      <beans:bean id="loginFilter"    

            class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
           <beans:property name="authenticationManager" ref="authenticationManager"/>
           <beans:property name="authenticationFailureHandler" ref="failureHandler"/>
           <beans:property name="authenticationSuccessHandler" ref="successHandler"/>
           <beans:property name="filterProcessesUrl" value="/login"/>
      </beans:bean>

      <beans:bean id="failureHandler"

             class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler">
            <beans:property name="defaultFailureUrl" value="/login.jsp?error=true" />
       </beans:bean>

       <beans:bean id="successHandler"

              class="org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler">
             <beans:property name="alwaysUseDefaultTargetUrl" value="true"/>
             <beans:property name="defaultTargetUrl" value="/main.jsp"/>
       </beans:bean>
       <!-- 验证后台用户 -->  
       <beans:bean id="adminLoginFilter"

               class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
               <beans:property name="authenticationManager" ref="authenticationManager"/>
               <beans:property name="authenticationFailureHandler" ref="adminFailureHandler"/>
               <beans:property name="authenticationSuccessHandler" ref="adminSuccessHandler"/>
               <beans:property name="filterProcessesUrl" value="/admin/login"/>
        </beans:bean>

        <beans:bean id="adminFailureHandler" 

                class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler">
               <beans:property name="defaultFailureUrl" value="/admin/login.jsp?error=true" />
        </beans:bean>

        <beans:bean id="adminSuccessHandler" 

                class="org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler">
                <beans:property name="alwaysUseDefaultTargetUrl" value="true"/>
                <beans:property name="defaultTargetUrl" value="/admin/main.jsp"/>
        </beans:bean>

      对比一下是不是就能看出很明显的差别啦,感觉Spring Security3.x的配置要比2.x写的多了些,还是2.x配置项写的少些。

      第四个问题,我们也是通过定义两个LogoutFilter来实现。这个和Spring Security2.x配置差不多,只是过滤器实际中在<http>中注册的,而不是直接在<bean>里注册。

    <!-- 注销过滤器,完成前台用户注销时的定向功能 -->
    <beans:bean id="logoutFilter" class="org.springframework.security.web.authentication.logout.LogoutFilter">
        <beans:constructor-arg value="/login.jsp" />
        <beans:constructor-arg>
            <beans:list>
                <beans:bean class="org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler" />
            </beans:list>
        </beans:constructor-arg>
        <beans:property name="filterProcessesUrl" value="/logout" />
    </beans:bean>
    <!-- 注销过滤器,完成后台用户注销时的定向功能 -->
    <beans:bean id="adminLogoutFilter" class="org.springframework.security.web.authentication.logout.LogoutFilter">
        <beans:constructor-arg value="/admin/login.jsp" />
        <beans:constructor-arg>
            <beans:list>
                <beans:bean class="org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler" />
            </beans:list>
        </beans:constructor-arg>
        <beans:property name="filterProcessesUrl" value="/admin/logout" />
    </beans:bean>

   

    上面改用到的过滤器我们都配置完成啦,现在我们在<http>中配置我们所需要的这4个过滤器,这点和2.x的配置是不同的。

   

    <http entry-point-ref="loginUrlEntryPoint">
        <intercept-url pattern="/login.**" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
        <intercept-url pattern="/admin/login.**" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
        <intercept-url pattern="/admin/**" access="ROLE_ADMIN"/>
        <intercept-url pattern="/**" access="ROLE_USER"/>
       

        <!-- 登录过滤器 -->
        <custom-filter before="FORM_LOGIN_FILTER" ref="loginFilter"/>
        <custom-filter position="FORM_LOGIN_FILTER" ref="adminLoginFilter"/>

        <!-- 注销过滤器 -->
        <custom-filter before="LOGOUT_FILTER" ref="logoutFilter"/>
        <custom-filter position="LOGOUT_FILTER" ref="adminLogoutFilter"/>
    </http> 

    注意Spring Security2.x中的AUTHENTICATION_PROCESSING_FILTER在Spring Security3.x中已被FORM_LOGIN_FILTER替换。

分享到:
评论

相关推荐

    spring security3.0帮助文档

    本文将深入探讨Spring Security 3.0在权限控制方面的应用,包括数据库设计、实体模型以及配置方法。 #### 数据库设计 在实现权限控制时,数据库的设计至关重要。Spring Security推荐使用以下表结构: 1. **...

    spring security3.0 demo

    这个“spring security3.0 demo”很可能是为了展示如何在实际应用中配置和使用Spring Security。 首先,Spring Security的核心概念包括: 1. **Filter Security Interceptor (FSI)**:这是Spring Security的主要...

    SpringSecurity3.0.x官方参考文档(英文+中文双解版)

    Spring Security 3.0.x 提供了基于XML和基于Java的配置方式。XML配置灵活且易于理解,适合初学者;而基于Java的配置更加简洁,适合经验丰富的开发者,可以通过注解来配置安全行为。 ### 3. 身份验证...

    Spring Security 3.0 权限管理

    Spring Security 3.0 是一个强大的安全框架,用于在Java应用程序中实现全面的安全管理解决方案。它专注于提供身份验证、授权和访问控制功能,确保只有经过验证的用户才能访问受保护的资源。本教程将深入探讨Spring ...

    spring security 3.0入门教程PDF

    通过以上的知识点,用户能够对Spring Security 3.0有一个全面的了解,并且能够根据这些知识开始配置和使用Spring Security,来为自己的Web应用程序提供安全性保护。随着学习的深入,用户可以对框架进行更高级的定制...

    Spring Security 3.0 安全权限管理手册

    &lt;html xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5"&gt; &lt;h1&gt;Welcome, &lt;sec:authentication property="principal.username"/&gt;&lt;/h1&gt; ``` ##### 4. 实现方法级安全 在方法级别添加安全...

    Spring-Security2.0 和 3.0中文文档

    学习Spring Security 2.0 和 3.0 的中文文档,将帮助开发者深入理解如何配置和使用其核心组件,以及如何处理常见的安全问题。文档通常会包含详细的配置示例、API参考、教程和最佳实践,帮助开发者构建安全的Java应用...

    springSecurity3.0

    当用户尝试访问未授权的资源或认证失败时,Spring Security可以抛出适当的异常,并配置自定义的错误页面或响应消息。 8. **配置灵活性** Spring Security的一大优点是其高度可配置性。通过XML或Java配置,我们...

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

    配置Spring Security以使用自定义的AuthenticationProvider,我们需要在`spring-security.xml`配置文件中进行相应的设置。添加一个新的bean,指定其为我们的自定义AuthenticationProvider,并将其与Spring Security...

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

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

    spring security3 中文版本

    Spring Security 3.0.1 是在 Spring Security 3.0 的基础上进行的一次 bug 修复版本,主要针对先前版本中存在的问题进行了修正。此次版本未引入新的功能,但修正了一些已知的问题,增强了稳定性。 ##### 1.4 获取 ...

    spring-security3 配置和使用

    Spring Security 3 配置和使用 Spring Security 是一个强大且灵活的安全框架,旨在保护基于 Java 的 Web 应用程序。Spring Security 3 是 Spring Security 框架的第三个主要版本,提供了许多新的功能和改进。下面...

    spring-security 官方文档 中文版

    本文档所指的版本为 Spring Security 3.0.1,这是一个 bug fix 版本,主要针对 3.0 版本中存在的问题进行修复,确保开发者能够获取更稳定可靠的 Spring Security 库。 **1.4 获取 Spring Security** - **项目模块*...

    spring security3.1.3 和 spring security3.0.0

    2. **XML配置简化**:通过使用更简洁的命名空间和元素,使得Spring Security的XML配置更加清晰易读。 3. **更强大的认证机制**:支持多种认证方式,如X.509证书、OpenID、CAS等。 4. **Web表单登录增强**:提供了...

    Spring_security例子源码

    7. **国际化**:Spring Security 支持多语言环境,可以在配置中定义不同语言的安全信息。 8. **OAuth2集成**:虽然这里提到的是Spring Security 3.0,但Spring Security 4.0及更高版本增加了对OAuth2的支持。如果这...

    spring security3配置和使用

    随着 Spring 3.0 的发布,Spring Security 也迎来了重大的版本更新,正式更名为 Spring Security,并成为了 Spring 家族的一员。这个版本引入了许多新特性,包括更简洁的配置方式、更强大的认证机制以及更加灵活的...

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

    Spring Security 3.0.1 是基于 Spring Security 3.0 的一个 bug fix 版本,主要修复了 3.0 中已知的问题,并对文档中的一些拼写错误进行了修正。 ##### 1.4 如何获取 Spring Security - **项目模块**:Spring ...

    spring3.0通过注解实现登录简单实例

    Spring3.0时,通常使用Maven或Gradle作为构建工具,添加Spring MVC和Spring Security的依赖到pom.xml或build.gradle文件中。 接下来,我们将创建一个Controller,这是Spring MVC中的关键组件,用于处理HTTP请求。在...

Global site tag (gtag.js) - Google Analytics