Spring Security 3.0 多页面登录配置

原创 2011年01月22日 17:05:00

      网上很多文章是关于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 security 多登陆页面问题

对于多登录界面,要求实现不同的用户,比如前台用户和后台用户,分别在以下情况中实现到不同页面的转向:            1、在未登录时,访问受限页面            2、在登录以后...
  • u014409449
  • u014409449
  • 2014年03月28日 14:50
  • 1104

spring security 多登陆入口实现方式 以及对spring security认证流程的理解

在需求上后台管理系统 需要有一个登陆页,同时手机端也允许普通用户登录。 这个时候我设置两个http过滤器 ...
  • zjlgdxzzw
  • zjlgdxzzw
  • 2015年08月17日 14:47
  • 1096

Spring Security 3.0 多页面登录配置

网上很多文章是关于Spring Security 2实现多页面登录的。因为现在需要使用Spring Security 3.x来实现所以只能自己动手解决。参考了网上这两篇文章《spring securi...
  • runming56
  • runming56
  • 2014年01月09日 08:40
  • 4059

Spring Security 3.0 多页面登录配置

网上很多文章是关于Spring Security 2实现多页面登录的。因为现在需要使用Spring Security 3.x来实现所以只能自己动手解决。参考了网上这两篇文章《spring ...
  • zjh527
  • zjh527
  • 2011年01月22日 17:05
  • 11927

Spring Security 自定义登录验证与自定义回调地址

1 配置文件 security-ns.xml
  • u014421556
  • u014421556
  • 2016年07月13日 14:27
  • 7024

Spring Security 多页面登录配置教程

SHOP++采用了著名的Spring Security框架技术作为站点权限的认证管理,下面就简要讲解一下多页面登录的配置方式。  (注意:本教程基于spring-security2.0.5版本,其它...
  • shenzhen_zsw
  • shenzhen_zsw
  • 2013年09月08日 21:58
  • 3187

解决:spring security 登录页停留时间过长 跳转至 403页面

前言:最近的项目中用到了spring security组件,说句显low的话:我刚开始都不知道用了security好不勒,提了bug,在改的过程中,遇到了一些问题,找同事交流,才知道是用的securi...
  • u013034889
  • u013034889
  • 2017年12月01日 23:23
  • 395

spring security 学习记录

spring security4+Spring MVC +Thymeleaf 3.0.3 问题记录
  • levelmini
  • levelmini
  • 2017年02月08日 17:52
  • 1036

关于spring-security登录后重定向至拦截前访问的url的实现原理

首先我们来看下我们整个流程图 这就是我自己摸索出来的关于整个访问拦截登录重定向的流程图 其中3,6,7步是对拦截前访问的request的处理 接下来是对以上几个步骤中关键代码的分析 ...
  • ZY_cookie
  • ZY_cookie
  • 2015年10月31日 19:08
  • 6826

spring security多入口登录

项目中集成了ldap的验证,从其他应用跳转过来希望不进行二次登录。 因为ldap的用户名和密码已经在登录中灭失,所以无法在应用中做再次提交验证。 幸好其他应用和项目是可以共享数据库,所以用数据库共...
  • ifunsu
  • ifunsu
  • 2015年04月03日 10:21
  • 842
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring Security 3.0 多页面登录配置
举报原因:
原因补充:

(最多只允许输入30个字)