1. 程式人生 > >Spring Security教程(10)---- 自定義登入成功後的處理程式及修改預設驗證地址

Spring Security教程(10)---- 自定義登入成功後的處理程式及修改預設驗證地址

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

form-login配置中的authentication-success-handler-ref可以讓手動注入登入成功後的處理程式,需要實現AuthenticationSuccessHandler介面。

[html]  view plain copy 在CODE上檢視程式碼片 派生到我的程式碼片
  1. <sec:form-login login-page="/login.jsp"  
  2.     login-processing-url="/login.do"  
  3.     authentication-failure-url="/login.jsp"  
  4.     authentication-success-handler-ref="authenticationSuccessHandler"  
  5. />  
springSecurity預設的登入使用者驗證路徑為:j_spring_security_check,這個路徑是可以通過l ogin-processing-url 來自己定義,比如我的就定義成了login.do。

然後在前臺登入頁面中改下form中的action就可以了。

配置檔案,注意這裡的defaultTargetUrl,本來這個是在form-login中,配置的但是如果我們自己定義登入成功後的處理程式後它就不起作用了,所以這個跳轉也需要我們在自定義程式中處理。

[html]  view plain copy 在CODE上檢視程式碼片 派生到我的程式碼片
  1. <bean id="authenticationSuccessHandler" class="com.zrhis.system.security.SimpleLoginSuccessHandler">  
  2.     <property name="defaultTargetUrl" value="/WEB-INF/app.jsp"></property>  
  3.     <property name="forwardToDestination" value="true"></property>  
  4. </bean>  
SimpleLoginSuccessHandler,這個類主要處理登入後的處理,我處理的是登入後記錄用戶的IP地址和登入時間,程式碼如下 

[java]  view plain copy 在CODE上檢視程式碼片 派生到我的程式碼片
  1. package com.zrhis.system.security;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.Date;  
  5.   
  6. import javax.servlet.ServletException;  
  7. import javax.servlet.http.HttpServletRequest;  
  8. import javax.servlet.http.HttpServletResponse;  
  9.   
  10. import org.apache.commons.logging.Log;  
  11. import org.apache.commons.logging.LogFactory;  
  12. import org.springframework.beans.factory.InitializingBean;  
  13. import org.springframework.beans.factory.annotation.Autowired;  
  14. import org.springframework.dao.DataAccessException;  
  15. import org.springframework.security.core.Authentication;  
  16. import org.springframework.security.web.DefaultRedirectStrategy;  
  17. import org.springframework.security.web.RedirectStrategy;  
  18. import org.springframework.security.web.authentication.AuthenticationSuccessHandler;  
  19. import org.springframework.transaction.annotation.Propagation;  
  20. import org.springframework.transaction.annotation.Transactional;  
  21. import org.springframework.util.StringUtils;  
  22.   
  23. import com.zrhis.base.exception.InitializationException;  
  24. import com.zrhis.system.bean.SysUsers;  
  25. import com.zrhis.system.repository.SysUsersRepository;  
  26.   
  27. public class SimpleLoginSuccessHandler implements AuthenticationSuccessHandler,InitializingBean {  
  28.       
  29.     protected Log logger = LogFactory.getLog(getClass());  
  30.       
  31.     private String defaultTargetUrl;  
  32.       
  33.     private boolean forwardToDestination = false;  
  34.       
  35.     private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();  
  36.       
  37.     @Autowired  
  38.     private SysUsersRepository sysUsersRepository;  
  39.       
  40.     /* (non-Javadoc) 
  41.      * @see org.springframework.security.web.authentication.AuthenticationSuccessHandler#onAuthenticationSuccess(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, org.springframework.security.core.Authentication) 
  42.      */  
  43.     @Override  
  44.     @Transactional(readOnly=false,propagation= Propagation.REQUIRED,rollbackFor={Exception.class})  
  45.     public void onAuthenticationSuccess(HttpServletRequest request,  
  46.             HttpServletResponse response, Authentication authentication)  
  47.             throws IOException, ServletException {  
  48.           
  49.         this.saveLoginInfo(request, authentication);  
  50.           
  51.         if(this.forwardToDestination){  
  52.             logger.info("Login success,Forwarding to "+this.defaultTargetUrl);  
  53.               
  54.             request.getRequestDispatcher(this.defaultTargetUrl).forward(request, response);  
  55.         }else{  
  56.             logger.info("Login success,Redirecting to "+this.defaultTargetUrl);  
  57.               
  58.             this.redirectStrategy.sendRedirect(request, response, this.defaultTargetUrl);  
  59.         }  
  60.     }  
  61.       
  62.     @Transactional(readOnly=false,propagation= Propagation.REQUIRED,rollbackFor={Exception.class})  
  63.     public void saveLoginInfo(HttpServletRequest request,Authentication authentication){  
  64.         SysUsers user = (SysUsers)authentication.getPrincipal();  
  65.         try {  
  66.             String ip = this.getIpAddress(request);  
  67.             Date date = new Date();  
  68.             user.setLastLogin(date);  
  69.             user.setLoginIp(ip);  
  70.             this.sysUsersRepository.saveAndFlush(user);  
  71.         } catch (DataAccessException e) {  
  72.             if(logger.isWarnEnabled()){  
  73.                 logger.info("無法更新使用者登入資訊至資料庫");  
  74.             }  
  75.         }  
  76.     }  
  77.       
  78.     public String getIpAddress(HttpServletRequest request){    
  79.         String ip = request.getHeader("x-forwarded-for");    
  80.         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {    
  81.             ip = request.getHeader("Proxy-Client-IP");    
  82.         }    
  83.         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {    
  84.             ip = request.getHeader("WL-Proxy-Client-IP");    
  85.         }    
  86.         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {    
  87.             ip = request.getHeader("HTTP_CLIENT_IP");    
  88.         }    
  89.         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {    
  90.             ip = request.getHeader("HTTP_X_FORWARDED_FOR");    
  91.         }    
  92.         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {    
  93.             ip = request.getRemoteAddr();    
  94.         }    
  95.         return ip;    
  96.     }  
  97.   
  98.     public void setDefaultTargetUrl(String defaultTargetUrl) {  
  99.         this.defaultTargetUrl = defaultTargetUrl;  
  100.     }  
  101.   
  102.     public void setForwardToDestination(boolean forwardToDestination) {  
  103.         this.forwardToDestination = forwardToDestination;  
  104.     }  
  105.   
  106.     /* (non-Javadoc) 
  107.      * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet() 
  108.      */  
  109.     @Override  
  110.     public void afterPropertiesSet() throws Exception {  
  111.         if(StringUtils.isEmpty(defaultTargetUrl))  
  112.             throw new InitializationException("You must configure defaultTargetUrl");  
  113.           
  114.     }    
  115.       
  116. }  
其中getIpAddress方法摘自網路,如有雷同純屬必然。

實現InitializingBean,在afterPropertiesSet中我們驗證defaultTargetUrl是否為空,如果為空就丟擲異常,因為這個地址是必須的。可以根據自己的情況來選擇要不要加驗證。

如果實現InitializingBean在程式啟動是Spring在建立完這個類並注入屬性後會自動執行afterPropertiesSet,所以我們的一些初始化的操作也是可以在這裡完成的。

onAuthenticationSuccess是主要的介面這個是登入成功後Spring呼叫的方法,而我們的跳轉和儲存使用者資訊都是在這裡完成的。

RedirectStrategy是Spring提供的一個客戶端跳轉的工具類。使用它可以支援“/index.jsp”這種地址,同時可以保證伺服器跳轉和客戶端跳轉的路徑一致。

加入我們的專案名為my ,專案訪問地址為http://localhost:8080/my

現在要使用客戶端跳轉到 "/login.jsp" 如果是response.sendRedirect 會直接跳轉到http://localhost:8080/login.jsp

而使用redirectStrategy.sendRedirect則會跳轉到http://localhost:8080/my/login.jsp

在redirectStrategy中,'/'代表的是專案根目錄而不是伺服器根目錄。


           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述