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