Springsecurity3.1.3配置多个登陆页面

需求:网站的前台和后台不同的url需要不同的登陆页面,不同的异常捕获方式。

spring-security3.1以后的版本支持多个<http>标签,因此本文所采用的方式就是使用两个,实际上是三个<http>标签实现上述功能(为什么是是要三个将会在下面加以说明)

spring-security.xml配置如下

<!-- 后台管理 -->
    <http pattern="/admin/**" authentication-manager-ref="authmanager" >      
        <intercept-url pattern="/admin/login**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
        <intercept-url pattern="/admin/**" access="ROLE_ADMIN" />  
        <form-login login-page="/admin/login.jsp"
         authentication-failure-url="/admin/login_fail.jsp"
          default-target-url="/admin/index.jsp"
        login-processing-url="你的Url"/>  
    </http>
    <!-- 前台 -->
    <http pattern="/mycenter/**" authentication-manager-ref="authmanager">      
        <intercept-url pattern="/front/login**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
        <intercept-url pattern="/mycenter/**" access="ROLE_USER" />  
        <form-login login-page="/front/login.jsp"
         authentication-failure-url="/front/login_fail.jsp"
          default-target-url="/front/index.jsp"
        login-processing-url="你的Url"/>  
    </http>

按照上述方法配置后,会出现程序代码中,无法获取当前登录用户信息的情况。SecurityContextHolder.getContext()为空。尤其是不在前台后台正则匹配下的url的程序段中。

出现这种情况是因为两个http拦截了两种特定的url表达式,那么其余的url将不会被springsecurity拦截,因此也就没办法再相应url的方法中获得当前登录用户的信息。

解决方法是在加上第三个<http>标签,匹配任意的url来把其余的url配置到过滤器。

原文地址:https://www.cnblogs.com/liuxiaoke/p/4456086.html