2013-06-14 25 views
5

Trong ứng dụng của tôi, tôi có một quản trị viên có thể xóa người dùng. vì vậy khi tôi xóa người dùng khỏi phiên quản trị, tôi muốn người dùng đã xóa đó sẽ tự động đăng xuất. Tôi biết id phiên của người dùng mà tôi xóa nhưng tôi không biết cách làm mất hiệu lực phiên sử dụng id phiên.Phá hủy phiên của một người dùng khác vào mùa xuân

Tôi muốn một cái gì đó như: invalidate (SessionId);

Có thể theo bất kỳ cách nào không? Tôi nghĩ rằng nó có thể sử dụng một bộ lọc và kiểm tra cơ sở dữ liệu theo yêu cầu nhưng có cách nào khác mà tôi không cần phải kiểm tra db trên mỗi httprequest?

Cảm ơn. : D

Trả lời

3

Tôi nghĩ tôi thấy giải pháp sử dụng cơ sở hạ tầng Bảo mật mùa xuân, với lớp SessionRegistry.

Bạn phải đăng ký HttpSessionEventPublisher trong web.xml:

<listener> 
    <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class> 
</listener> 

Trong cấu hình mùa xuân của bạn, khai báo SessionRegistry.

<bean id="sessionRegistry" 
    class="org.springframework.security.core.session.SessionRegistryImpl" /> 

Trong giao diện điều khiển quản trị của bạn, bạn phải sử dụng các SessionRegistry để lấy SessionInformation của người sử dụng và gọi expireNow. Theo yêu cầu tiếp theo của người dùng, một bộ lọc servlet sẽ làm cho HttpSession hết hạn. Javadoc của SessionInformation có một số giải thích về cách hoạt động của nó.

Hãy cho chúng tôi biết nếu điều đó có ích.

+0

Tôi đang gặp sự cố, tôi đã đăng ký phiên gọi * sessionRegistry.registerNewSession (phiên chuỗi, đối tượng chính) * khi tôi xóa người dùng, tôi nhận phiên chính xác và tôi gọi * sessionInformation.expireSession() * trong bộ điều khiển nhưng nó không hoạt động. phiên của người dùng vẫn đang hoạt động – Josema

+1

Tôi đã đọc lại [docs] (http://static.springsource.org/spring-security/site/docs/3.0.x/reference/session-mgmt.html) và Tôi nghĩ bạn cũng phải thêm '' vào phần ' 'của cấu hình bảo mật Spring của bạn. Tôi mong nó sẽ có ích. – LaurentG

3
// to end a session of a user: 
List<SessionInformation> sessions = sessionRegistryImpl.getAllSessions(user, false); 
sessionRegistryImpl.getSessionInformation(sessions.get(0).getSessionId()).expireNow(); 

// note: you can get all users and their corresponding session Ids: 
List<Object> users = sessionRegistryImpl.getAllPrincipals(); 
List<String> sessionIds = new ArrayList<>(users.size()); 

for (Object user: users) { 
    List<SessionInformation> sessions = sessionRegistryImpl.getAllSessions(user, false); 
    sessionIds.add(sessions.get(0).getSessionId()); 
} 
0

Cùng với những gì đã được đề xuất bởi @LaurentG, nhu cầu sau đây để được thêm vào trong tập tin cấu hình mùa xuân của bạn:

<session-management> 
    <concurrency-control session-registry-alias="sessionRegistry" /> 
</session-management> 

cho nó để làm việc. Câu trả lời @zygimantus cũng có thể được sử dụng để truy cập dữ liệu phiên.