2013-02-27 29 views
6

Trong ứng dụng của tôi, tôi có thể thay đổi quyền và vai trò của người dùng trong chương trình phụ trợ.Xác thực lại quyền lực sau khi quyền của người dùng đã được thay đổi

Khi người dùng đăng nhập và tôi xóa vai trò của người dùng, người dùng vẫn có thể truy cập nội dung mà anh ấy thực sự không được phép truy cập nữa, vì anh ấy thiếu vai trò. Các thay đổi chỉ có hiệu lực khi người dùng tự xác nhận lại với đăng xuất/đăng nhập.

Vì vậy, câu hỏi của tôi là, tôi có thể truy cập phiên của người dùng đã đăng nhập (không phải tôi) không? Tôi biết tôi có thể truy cập vào phiên của riêng tôi và phá hủy nó mà buộc tôi phải đăng nhập lại. Nhưng tôi muốn nhận phiên của bất kỳ người dùng nào đã đăng nhập. Điều này có khả thi không? Tôi không thể tìm thấy bất kỳ tài nguyên nào về điều đó.

Tôi sử dụng PdoSessionStorage với symfony2.1 và fosuserbundle.

+0

cũng được hỏi tại đây, không có câu trả lời. http://stackoverflow.com/questions/14184484/how-to-administratively-invalidate-a-session-that-used-remember-me-option – MDrollette

+0

@MDrollette Tôi cảm thấy điều này sẽ được trả lời. Tôi nghĩ giải pháp duy nhất có thể là trình quản lý phiên tùy chỉnh –

+0

Nó chỉ là vấn đề lưu trữ ID người dùng cùng với ID phiên trong bảng phiên. Không âm thanh đặc biệt khó khăn nhưng tôi không chắc chắn về cách tiếp cận tốt nhất hoặc. – MDrollette

Trả lời

9

Làm cho lớp người dùng của bạn triển khai Symfony\Component\Security\Core\User\EquatableInterface.

Nếu bạn trả lại false từ phương thức isEqualTo(), người dùng sẽ được xác nhận lại. Sử dụng phương pháp đó để so sánh chỉ những thuộc tính mà khi thay đổi sẽ buộc xác thực lại - vai trò trong trường hợp của bạn.

+0

+1 Ok tôi hiểu điều đó. Tôi phải làm gì để kiểm tra? Tôi phải làm theo mọi yêu cầu? –

+0

Chỉ cần làm cho lớp người dùng của bạn triển khai giao diện. Bạn sẽ bị buộc phải thực hiện phương thức 'isEqualTo()'. Phần còn lại được xử lý bởi Symfony. –

+0

Tuyệt vời hoạt động!) –

-1

Bạn có thể khắc phục vấn đề này bằng cách làm theo một cách tiếp cận tương tự như những gì tôi đã làm:

  1. Khi người dùng đăng nhập, lưu trữ tất cả các quyền trong phiên cùng với một checksum trong những quyền.
  2. Lưu cùng một tổng kiểm tra trong cơ sở dữ liệu hoặc trên đĩa, với ID người dùng đó
  3. Bất cứ khi nào người dùng thực hiện yêu cầu, xác minh rằng tổng kiểm tra trên đĩa khớp với số trong phiên cho người dùng đó. Nếu nó khác, hãy tải lại quyền vào phiên của người dùng
  4. Khi bạn thay đổi quyền, hãy cập nhật tổng kiểm tra trong cơ sở dữ liệu (hoặc trên đĩa) được lưu trữ với người dùng đó. Điều này sẽ kích hoạt một đồng bộ hóa trên yêu cầu tiếp theo của họ.
+0

Hm trông thú vị nhưng phức tạp là tốt. Đây có phải là một số loại trợ giúp bạn đang phát triển không? –

+0

@artworkad シ không thực sự phức tạp, sử dụng các thành phần cơ bản của symfony2 như vùng chứa dịch vụ, ngữ cảnh bảo mật và đối tượng yêu cầu để xác định việc cần làm với quyền. – JamesHalsall

+0

@Jaitsu, giải pháp tích hợp của Symfony là * rất đơn giản, bạn sẽ cười điên cuồng. Xem câu trả lời của tôi. ;) –

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