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 --> 
<!-- constructor-arg 注销后跳转URL --> 
<!-- 前台用户注销 --> 

<bean id="shopLogoutFilter" class="org.springframework.security.ui.logout.LogoutFilter"> 
 <sec:custom-filter before="LOGOUT_FILTER" /> 
 <constructor-arg value="/" /> 
 <constructor-arg> 
  <list> 
   <bean class="org.springframework.security.ui.logout.SecurityContextLogoutHandler" /> 
  </list> 
 </constructor-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" /> 
 <constructor-arg value="/admin/admin!login.action" /> 
 <constructor-arg> 
  <list> 
   <bean class="org.springframework.security.ui.logout.SecurityContextLogoutHandler" /> 
  </list> 
 </constructor-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"; 
 } 

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐