2012-04-24 28 views
5

Mô tả chungLàm thế nào để tạo một hệ thống cho phép như sau với Symfony 2?

Hệ thống này nên xử lý rất nhiều các mặt hàng xếp vào các mục lồng nhau (xem ví dụ trực quan dưới đây) trong khi đem lại cho khách hàng khả năng để xác định các quy tắc cho phép (xem quy tắc phép dưới đây). Nó cũng phải xử lý các quyền chung khác nhau độc lập với bất kỳ mục nào (ví dụ: 'có thể xem trang cụ thể?' Hoặc 'có thể mời thành viên mới không?').

Tất cả người dùng được sắp xếp thành các nhóm. Mỗi người dùng có một nhóm chính mà anh ấy thuộc về, nhưng anh ấy cũng có thể có một số nhóm phụ bổ sung.

Một vài người dùng có thể được định cấu hình là quản trị viên cấp cao và phải được phép làm bất kỳ điều gì.

Khi quyết định nếu một người dùng được phép làm điều gì đó, sự kế thừa cho phép là như sau:

  • Bắt đầu với các điều khoản nhóm chính
  • Cho phép tất cả các quyền phép của bất kỳ nhóm bổ sung của người dùng
  • Nếu được xác định, hãy kiểm tra các quyền cụ thể của người dùng (để cho phép hoặc từ chối, độc lập với các điều trên). phép người sử dụng cụ thể không nhất thiết phải được xác định, nếu họ không được định nghĩa người dùng chỉ cần kế thừa quyền từ các nhóm quyền

Khi xác định được sự cho phép nhóm, khách hàng có thể sử dụng thừa kế để nói điều gì đó như:

  • người dùng được phép ...
  • Biên tập có tất cả các quyền của người sử dụng + ...
  • Điều Hành có tất cả các quyền của biên tập viên + ... - ...
  • Admins có tất cả các quyền của biên tập viên + Điều Hành

LƯU Ý: tôi sẽ có thể yêu cầu 10 mặt hàng cuối cùng từ cơ sở dữ liệu mà người dùng hiện tại có thể chỉnh sửa/xem , sự cho phép cho mỗi mục nên được quyết định bởi cơ sở dữ liệu, tôi không muốn lọc các mục cho phép ở cấp ứng dụng nếu tôi có thể quyết định dựa trên thông tin được lưu trữ trong cơ sở dữ liệu.

Permission cai

Nội quy có thể phụ thuộc vào bất cứ tài sản của mặt hàng đó (nhóm chính của chủ sở hữu ví dụ mục của, thời gian tạo, thể loại vv ...), thông tin được lưu trữ trong cơ sở dữ liệu.

Quy tắc cũng có thể phụ thuộc vào bất kỳ thuộc tính nào của người dùng hiện tại (ví dụ: ngày đăng ký, thành viên được mời), hành động được yêu cầu (ví dụ: xem, danh sách, đổi tên, hoàn tác xóa vv) và thông tin khác đã có sẵn trong thời gian chạy (ví dụ: tham số url, giới hạn hạn ngạch, nội dung của mục, tải trên máy chủ), thông tin đó có sẵn cho tập lệnh php.

Xem các quy tắc mẫu bên dưới.

trực quan ví dụ của giản đồ cơ sở dữ liệu:

Category 1 
    Nested Category A 
     item x 
    Nested Category B 
     Deeply Nested Category 
     item w 
     item y 
Category 2 
    item z 

Hiện nay, lược đồ cơ sở dữ liệu là như sau nhưng tôi có thể thay đổi nó nếu nó yêu cầu: (tất nhiên đây chỉ là một phần của lược đồ, có là bảng khác và các lĩnh vực cũng)

mục:

id | title | owner_id | category_id 
==================================== 
1 | item x | 2  | 3 
2 | item y | 1  | 4 
3 | item z | 3  | 2 
4 | item w | 1  | 5 

loại:

id | parents | title 
===================================== 
1 | null | Category 1 
2 | null | Category 2 
3 | 1  | Nested Category A 
4 | 1  | Nested Category B 
5 | 1/4  | Deeply Nested Category 

người dùng:

id | name | group | all_groups | is_super_admin 
=============================================== 
1 | Tony | 5  | 5   | 1 
2 | John | 5  | 5,8,6  | 0 
3 | Mike | 4  | 4,7  | 0 
4 | Ryan | 6  | 6   | 0 

quy tắc mẫu

Các quy tắc sau chỉ là mẫu các trường hợp thế giới thực mà cần được thực hiện.

  • Người dùng có thể chỉnh sửa các mặt hàng của mình trong vòng 5 phút từ trình()
  • tài 'John' có thể chỉnh sửa tất cả các mục bên trong 'Chuyên mục 1' và tất cả các loại lồng nhau của nó.
  • Người chỉnh sửa có thể chỉnh sửa tất cả các mục ngoại trừ các mục mà chủ sở hữu của họ được đánh dấu là quản trị viên cấp cao.

Lưu ý rằng các quy tắc này có thể được quyết định ở cấp cơ sở dữ liệu giống như hầu hết các quy tắc trong trường hợp của tôi.

Thực hiện

docs symfony Tôi đã tìm kiếm, stackoverflow vv Có rất nhiều điều thú vị và các câu hỏi về chủ đề an ninh và ACL nhưng tôi không thể tìm ra cách tốt nhất để xử lý như một hệ thống.

Rõ ràng là tôi cần một số loại trình tạo truy vấn động để lọc các hàng dựa trên thông tin được lưu trữ trong cơ sở dữ liệu theo các quy tắc được xác định. Tôi giả sử bước thứ hai (liên quan đến thông tin không được lưu trữ trong cơ sở dữ liệu như tải máy chủ hiện tại) có thể thực hiện cử tri (xem ví dụ cử tri ở this article hoặc this question), hoặc đôi khi thậm chí là giải pháp đơn giản hơn (chẳng hạn như các quy tắc phụ thuộc vào đường dẫn được yêu cầu). Nếu giải pháp liên quan đến nhiều thứ để xử lý quyền, vui lòng mô tả cách tích hợp và sử dụng chúng cùng nhau.

Câu hỏi

tôi hỏi làm thế nào để thực hiện một hệ thống như vậy, xin đừng trả lời với các liên kết đến tài liệu symfony hoặc các nguồn lực khác với ý tưởng chung và các trường hợp đơn giản thông thường. Vui lòng đọc và hiểu trường hợp của tôi trước khi trả lời.

+4

Bạn đã tìm thấy một thiết kế phù hợp cho hệ thống của bạn? Nếu vậy bạn có thể đăng nó ở đây? Tôi đang tiếp cận việc thực hiện một cái gì đó tương tự. Cảm ơn! – mokagio

+1

Xin lỗi, nhưng sau vài ngày tìm kiếm giải pháp làm việc với symfony tôi đã từ bỏ ... – Xuni

+2

Tôi cũng vậy ... Chúng tôi đã triển khai một hệ thống tùy chỉnh đơn giản lấy cảm hứng từ Symfony ACL và sử dụng một số thành phần cơ bản. Cá nhân tôi thực sự thất vọng. – mokagio

Trả lời

1

Tôi nhận thấy câu hỏi này cũ, nhưng câu trả lời có thể áp dụng cho Symfony 2.3+, vì vậy tôi đăng nó ở đây.

Đối với phương pháp này, bạn nên sử dụng những thứ như SecurityVoters.

Với cử tri bảo mật, bạn có thể triển khai bất kỳ logic nào cho các điều khiển truy cập mà bạn có thể tưởng tượng.

Cử tri hoạt động như

$this->get('security.authorization_checker')->isGranted('update',$post); 

mà sẽ rà soát tất cả các cử tri, những người có thể vận hành một bài thực thể (xem tài liệu) và kết hợp lá phiếu của họ với chiến lược choosen (khẳng định, sự đồng thuận, nhất trí) để quyết định nếu người dùng hiện tại được phép cập nhật bài đăng (ví dụ tule đầu tiên của bạn)

Bạn có thể thực hiện một số cử tri cho một hành động và xác định chiến lược để quyết định bỏ phiếu kết quả.

Tất cả các nhóm và quyền bạn có thể lưu trữ trong kho lưu trữ và tìm nạp chúng với giáo lý bên trong cử tri.

Ngoài ra bạn có thể xác định vai trò hierarhy tùy chỉnh cho đơn giản hóa an ninh công trình

Cũng đọc những tài liệu trên SecurityComponent

+1

KnpUniversity https://knpuniversity.com/screencast/new-in-symfony3/voter cho một hướng dẫn ngắn giải thích những điều quan trọng nhất :-) – MauganRa

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