2011-01-06 42 views
6

tôi cần phải vô hiệu hóa (hoặc bắt đầu) phiên người dùng. ứng dụng chỉ giới hạn đăng nhập người dùng chỉ một người dùng trên mỗi vùng chứa.Phiên bảo mật mùa xuân không hợp lệ

tôi cố gắng gọi removeSessionInformation từ phiên đăng ký, được thực hiện để mở khóa người dùng. để người dùng khác có thể đăng nhập bằng tên người dùng phiên được khởi động.

nhưng SessionContextHolder tại người dùng đó đã bị đá vẫn còn. vì vậy họ vẫn có quyền hạn tương tự để truy cập trang được bảo vệ.

cách làm mất hiệu lực hoặc xóa Hiệu trưởng của SessionContextHolder khỏi thông tin đăng ký phiên được chỉ định?

ps: trong ứng dụng cũ của tôi, tôi cung cấp một biến trong UserDomain (UserDetails) giữ HttpSession. và khi họ cần khởi động người dùng, tôi chỉ vô hiệu hóa HttpSession từ UserDomain được chỉ định. nhưng tôi không biết làm thế nào để làm điều đó trong mùa xuân (của nó giống như nhiều hơn để loại bỏ Hiệu trưởng của SessionContextHolder hơn HttpSession). thực hiện gần như giống với cách SessionRegistryImpl làm vào mùa xuân.

Trả lời

10

Bạn có thể muốn xem xét Xuân An Concurrency Control. Bạn có thể định cấu hình để hạn chế số phiên đồng thời trên mỗi người dùng và hết hạn (đá) các phiên hiện tại nếu số đó vượt quá.

Spring Security Session Management

Đây là một đoạn cấu hình của chúng tôi (Spring 3):

<http> 
    ... 
    <session-management> 
     <concurrency-control max-sessions="1"/> 
    </session-management> 
    ... 
</http> 
7

Tôi đoán đây là cách để làm điều đó:

SecurityContextHolder.getContext().setAuthentication(null) 

Từ SecurityContext.setAuthentication(Authentication) Javadocs:

Thay đổi hiện thực chính, hoặc loại bỏ các thông tin xác thực.

Tham số: xác thực
- mới Xác thực thẻ, hoặc null nếu không thông tin xác thực hơn nữa nên được lưu trữ

+0

Câu trả lời này là đúng, cũng phải chắc chắn làm mất hiệu lực phiên web của bạn. –

+1

hi brian, tôi nghĩ câu trả lời của bạn chỉ làm mất hiệu lực (hoặc xóa) 'SecurityContextHolder' của phiên người dùng đăng nhập hiện tại. những gì tôi cần là xóa 'SecurityContextHolder' của phiên người dùng khác. chúng ta có thể làm nó ở sping không? –

+0

điều này không dành cho những người dùng khác – z0mb1ek

0

này được chiết xuất từ ​​ứng dụng security.xml

class="org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy" 
     p:maximumSessions="1" <br> 
        **p:exceptionIfMaximumExceeded="true"** > 
     <constructor-arg name="sessionRegistry" ref="sessionRegistry" /> 

thử thêm dòng trong tôi chữ in đậm sau số phiên tối đa

6

Bạn cũng có thể làm như sau để xóa Phiên SpringSecurity:

SecurityContextHolder.clearContext() 
Các vấn đề liên quan