2012-10-22 38 views
8

Tôi đang sử dụng Symfony2 và tôi có người dùng và vai trò đã được lưu trữ trong DB của tôi. Nếu tôi đặt một cái gì đó như dưới đây trong security.yml nó hoạt động tuyệt vời:Làm thế nào để lưu trữ thông tin "access_control" của Symfony2 trong cơ sở dữ liệu?

access_control: 
    - { path: ^/admin, role: ROLE_ADMIN} 
    - { path: ^/users, role: ROLE_MANAGER} 

Nhưng tôi muốn để lưu trữ thông tin access_control này trong cơ sở dữ liệu, vì vậy người sử dụng từ hệ thống của tôi có thể thay đổi các điều khoản riêng của mình bằng cách sử dụng các giao diện quản trị.

Tôi đã xem ACL và FOSUserBundle nhưng không thể tìm thấy giải pháp cho việc này. Tôi thấy rằng tôi có thể kiểm tra quyền với một cái gì đó như if ($user->hasRole($role)) nhưng tôi sẽ cần phải làm điều này trong mọi bộ điều khiển.

Có cách nào để xác định tính năng "access_control" động không? Có thể một cái gì đó như chuyển hướng access_control đến một số lớp có thể trả về true hoặc false. Bất kỳ giải pháp nào?

Trả lời

5

Cách tốt nhất là thiết lập vai trò cụ thể (ví dụ: DB_ROLE_CHECK) mà bạn đặt trên các hành động/dịch vụ mà bạn muốn xác thực đối với vai trò được lưu trữ cơ sở dữ liệu của mình.

Sau đó, bạn sẽ tạo một cử tri bảo mật gắn vào DB_ROLE_CHECK và xác thực yêu cầu của bạn dựa vào các mục nhập cơ sở dữ liệu của bạn.

Xem:

+0

Cảm ơn, nó đã hoạt động hoàn hảo! –

+0

Tôi không hiểu. Tôi cần đặt vai trò DB_ROLE_CHECK trong phân cấp vai trò và cách kiểm tra tuyến đường trong Cử tri? Ví dụ tôi có các mục DB như [route, roles]. Và trong quy tắc access_control^/: DB_ROLE_CHECK, phải không? Vì vậy, nó sẽ thực thi DBVoter trên mọi yêu cầu. Trong thuộc tính $ tôi sẽ có vai trò, sau đó $ token. Và tôi sẽ có một con đường hoặc con đường như param đối tượng $ sau đó? Vì vậy, tôi cần lấy bản ghi DB theo đường dẫn và sử dụng vai trò của nó với $ user từ $ token trong một decisionManager, đúng không? –

3

Bản đồ truy cập được xây dựng here.

Nếu không tìm thấy access_control, không có gì được thực hiện.

Bây giờ, hãy xác định việc triển khai AccessMapInterface của riêng bạn và ghi đè thông số security.access_map.class với lớp học của bạn.

Có thể bạn sẽ cần một nhà máy để xây dựng Bản đồ truy cập của mình.

+1

Tôi đang cố gắng để làm điều đó, nhưng xin vui lòng, làm thế nào tôi có thể ghi đè tham số security.access_map.class? Tôi đã thử đặt nó trong security.yml: security: access_map: class: CRM \ CoreBundle \ Security \ DBAccessMap –

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