需求:網站的前台和后台不同的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配置到過濾器。