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.
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
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
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