2011-12-12 28 views
8

Tôi đang sử dụng Tomcat 6.0.32, Bảo mật mùa xuân 3.0.5Có thể vô hiệu hóa phiên bảo mật mùa xuân không?

Trong ứng dụng web của tôi, một số người dùng có khả năng thay đổi đặc quyền người dùng khác. Khi điều này xảy ra, tôi muốn vô hiệu hóa bất kỳ phiên nào cho người dùng có đặc quyền đã được thay đổi. Điều này có thể và nếu như vậy như thế nào?

Trả lời

12

Bạn thường không thể vô hiệu hóa (các) phiên của người dùng ngay khi bạn thay đổi thông tin tài khoản của mình mà không cần sử dụng API cụ thể của vùng chứa, vì cách duy nhất để truy cập HttpSession là thông qua đối tượng HttpServletRequest.

Thay vào đó bạn có thể lưu bộ nhớ cache tên người dùng trong cửa hàng trong bộ nhớ và tham khảo bộ lọc trong bộ lọc hoặc tùy chỉnh AccessDecisionVoter. Việc sử dụng cờ trong bảng người dùng không thực sự là một ý tưởng tuyệt vời, vì cờ là tạm thời trong tự nhiên (nó không liên quan sau khi khởi động lại máy chủ) và tốt hơn là tránh truy cập hiệu suất của truy vấn cơ sở dữ liệu trên mọi yêu cầu.

Có một blog article on using custom voters cho loại điều này. Nó đã lỗi thời nhưng cách tiếp cận chung là âm thanh.

Cách tiếp cận khác là sử dụng SessionRegistry của Spring Security là một phần của chức năng quản lý phiên. Thông thường, điều này được sử dụng để giới hạn số lượng phiên mà người dùng có thể có nhưng cũng có thể được sử dụng để list currently authenticated users hoặc đánh dấu phiên của họ là hết hạn.

Cũng có thể là ý tưởng chỉ cần tải lại các đặc quyền của người dùng thay vì ghi lại chúng hoàn toàn.

+0

Cảm ơn ý tưởng và cho các liên kết thông tin. Tôi sẽ cung cấp cho nó một shot và cho bạn biết làm thế nào nó đi. – kasdega

+0

Điều này chỉ hoạt động nếu ứng dụng của bạn đang chạy trên một máy chủ. Là nó? – sourcedelica

+0

Yep hiện chỉ có trên một máy chủ. Sẽ ghi nhớ điểm của bạn mặc dù khi chúng tôi chuyển sang nhiều máy chủ. – kasdega

0

Đối tượng HTTPSession có phương thức vô hiệu. Khi người dùng thay đổi một số quyền bạn cần gọi phương thức này để vô hiệu và tải lại chúng cho phiên hiện tại.

2

Giả sử bạn đang chạy ứng dụng của mình trên nhiều máy chủ, bạn sẽ cần phải có cách để thực hiện điều này trên tất cả các máy chủ.

  1. Thêm trường dấu thời gian vào bảng người dùng (hoặc tương đương) được cập nhật khi thay đổi người dùng.

  2. Viết bộ lọc servlet để kiểm tra xem phiên hiện tại có được xác thực không và dấu thời gian cho người dùng trong DB lớn hơn thời gian tạo của phiên. Nếu như vậy làm mất hiệu lực phiên và chuyển hướng ở đâu đó.

Bộ lọc này sẽ cần phải đến sau bộ lọc Bảo mật mùa xuân.

Nếu bạn không chạy ứng dụng của mình trên nhiều máy chủ thì bạn có thể sử dụng SessionRegistry.

+0

Đã thay đổi để sử dụng dấu thời gian thay vì cờ. – sourcedelica

+0

Prvis của người dùng là gì? – Stephane

+0

Kịch bản của bạn là từ chối đăng nhập lần hai? Không đăng xuất lần đăng nhập đầu tiên. – Stephane

Các vấn đề liên quan