(八)Spring Security 防止用戶重複登錄

目錄


我們接着上一章(七)Spring Security基於ajax登錄,進行開發

本篇介紹如何實現一個用戶只允許同時在一個地點登錄

  1. 基本配置 踢掉之前的登陸
    protected void configure(HttpSecurity http) throws Exception {
    	http.sessionManagement()
    			.maximumSessions(1).expiredUrl("/login");
    
    maximumSessions配置一個用戶的最大session數量,默認不限,這裏設1。先在一個瀏覽器如chrome登錄,然後在另一個瀏覽器如firefox登錄,此時同時登錄數爲2超出參數1,之前chrome的session將會過期,再去chrome發出請求會跳轉到過期url。
  2. 防止再次登錄
    protected void configure(HttpSecurity http) throws Exception {
    	http.sessionManagement()
    			.maximumSessions(1).maxSessionsPreventsLogin(true);
    
    此時不會踢出之前的登錄者,而是先登錄者建立了唯一session,在他註銷或關閉瀏覽器之前,不允許異地再次登錄。
  3. 上面兩種都需配置
    http..logout()
             .logoutSuccessUrl("/home").invalidateHttpSession(true);
    

注意:
Spring Security 是使用org.springframework.security.core.userdetails.User類作爲用戶登錄憑據( Principal )的。該類中重寫了equals()和hashCode(),使用username屬性作爲唯一憑據。
在這裏插入圖片描述
那麼我們實現的UserDetails也應該重寫equals()和hashCode()
在這裏插入圖片描述
在User中重寫
在這裏插入圖片描述
工作原理

在org.springframework.security.web.authentication.session.ConcurrentSessionControlAuthenticationStrategy包下的onAuthentication方法(每次用戶登錄都會觸發),會依據用戶登錄的authentication取出改用戶在服務器的所有session,並計算該用戶在服務器創建了多少個session,如果session多於設置的數量,會使用排序算法,得到最早的session,並將其設置爲過期(刪除)

項目地址
Spring Security 防止用戶重複登錄

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章