Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Lược đồ cơ sở dữ liệu cho ACL

Theo kinh nghiệm của tôi, câu hỏi thực sự chủ yếu nằm ở việc liệu có xảy ra bất kỳ giới hạn truy cập dành riêng cho người dùng nào hay không.

Ví dụ:giả sử bạn đang thiết kế lược đồ của một cộng đồng và bạn cho phép người dùng chuyển đổi chế độ hiển thị của hồ sơ của họ.

Một tùy chọn là gắn cờ hồ sơ công khai / riêng tư và tuân theo kiểm tra quyền trước, rộng:'users.view' (xem người dùng công khai) so với, giả sử, 'users.view_all' (xem tất cả người dùng, dành cho người kiểm duyệt) .

Một quyền khác liên quan đến các quyền được tinh chỉnh hơn, bạn có thể muốn họ có thể định cấu hình mọi thứ để họ có thể làm cho mình (a) có thể xem được bởi tất cả mọi người, (b) có thể xem được bởi những người bạn đã chọn của họ, (c) được giữ kín hoàn toàn và có lẽ (d ) có thể xem được bởi tất cả ngoại trừ các bozos được chọn bằng tay của họ. Trong trường hợp này, bạn cần lưu trữ dữ liệu liên quan đến chủ sở hữu / quyền truy cập cho các hàng riêng lẻ và bạn sẽ cần phải trừu tượng hóa một số điều này để tránh hiện thực hóa việc đóng bắc cầu của một biểu đồ có định hướng, dày đặc.

Với cả hai cách tiếp cận, tôi nhận thấy rằng sự phức tạp gia tăng trong chỉnh sửa / phân công vai trò được bù đắp bởi sự dễ dàng / linh hoạt trong việc chỉ định quyền đối với các phần dữ liệu riêng lẻ và các quyền sau đây hoạt động tốt nhất:

  1. Người dùng có thể có nhiều vai trò
  2. Các vai trò và quyền được hợp nhất trong cùng một bảng với cờ để phân biệt hai vai trò (hữu ích khi chỉnh sửa vai trò / quyền)
  3. Các vai trò có thể chỉ định các vai trò khác và các vai trò và quyền có thể chỉ định quyền (nhưng quyền không thể chỉ định vai trò), từ trong cùng một bảng.

Sau đó, biểu đồ định hướng kết quả có thể được kéo thành hai truy vấn, được tạo một lần và mãi mãi trong một khoảng thời gian hợp lý bằng cách sử dụng bất kỳ ngôn ngữ nào bạn đang sử dụng và được lưu vào bộ nhớ cache vào Memcache hoặc tương tự để sử dụng tiếp theo.

Từ đó, việc kéo các quyền của người dùng là vấn đề kiểm tra xem anh ta có những vai trò nào và xử lý chúng bằng cách sử dụng biểu đồ quyền để có được các quyền cuối cùng. Kiểm tra quyền bằng cách xác minh rằng người dùng có vai trò / quyền được chỉ định hay không. Và sau đó chạy truy vấn của bạn / đưa ra lỗi dựa trên việc kiểm tra quyền đó.

Bạn có thể mở rộng kiểm tra cho các nút riêng lẻ (tức là check_perms($user, 'users.edit', $node) cho "có thể chỉnh sửa nút này" so với check_perms($user, 'users.edit') cho "có thể chỉnh sửa một nút") nếu bạn cần và bạn sẽ có một cái gì đó rất linh hoạt / dễ sử dụng cho người dùng cuối.

Như ví dụ mở đầu sẽ minh họa, hãy cảnh giác với việc lái quá nhiều vào quyền cấp hàng. Việc kiểm tra các quyền của một nút riêng lẻ ít xảy ra hơn việc kiểm tra một danh sách các nút hợp lệ (tức là chỉ những nút mà người dùng có thể xem hoặc chỉnh sửa). Tôi khuyên bạn nên chống lại bất cứ điều gì ngoài cờ và trường user_id trong chính các hàng nếu bạn không (rất) thành thạo trong việc tối ưu hóa truy vấn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách làm mới datagrid trong WPF

  2. MYSQL làm thế nào để mở khóa bảng nếu tôi đã sử dụng lệnh LOCK bảng table_name WRITE;

  3. Tự động thêm các chữ cái vào trước một fieild tăng dần tự động

  4. SQL chỉ chọn các hàng có giá trị tối đa trên một cột

  5. Không thể lưu trữ các ký tự UTF8 trong MySQL