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

Cách thiết kế hệ thống kiểm soát truy cập dựa trên vai trò phân cấp

Có một cách để triển khai kế thừa vai trò bằng cách sử dụng quan hệ đệ quy trên bảng Roles , bằng cách tham chiếu vai trò đến một bản ghi khác:

Mối quan hệ này sẽ thêm 1 : n kế thừa trong Roles ghi lại. Bạn có thể có được toàn bộ cây phân cấp với chức năng được lưu trữ này:

CREATE FUNCTION `getHierarchy`(`aRole` BIGINT UNSIGNED)
RETURNS VARCHAR(1024)
NOT DETERMINISTIC
READS SQL DATA
BEGIN
DECLARE `aResult` VARCHAR(1024) DEFAULT NULL;
DECLARE `aParent` BIGINT UNSIGNED;

SET `aParent` = (SELECT `parent` FROM `Roles` WHERE `id` = `aRole`);

WHILE NOT `aParent` IS NULL DO

    SET `aResult` = CONCAT_WS(',', `aResult`, `aParent`);
    SET `aParent` = (SELECT `parent` FROM `Roles` WHERE `id` = `aParent`);

END WHILE;

RETURN IFNULL(`aResult`, '');
END

Sau đó, bạn có thể nhận được tất cả được cấp quyền với một cái gì đó như thế này:

SELECT
    `permission_id`
FROM
    `Permission_Role`
WHERE
    FIND_IN_SET(`role_id`, `getHierarchy`({$role}))
    AND
    grant;

Nếu nó không đủ, bạn có thể tạo một bảng khác để kế thừa:

Tuy nhiên, trong trường hợp này, cần một thuật toán thu thập phân cấp khác.

Để giải quyết ghi đè vấn đề bạn sẽ phải nhận quyền vai trò và quyền người dùng. Sau đó, viết user quyền đối với roles quyền đối với session .

Ngoài ra, tôi khuyên bạn nên loại bỏ grant các cột trong Permission_RolePermission_User . Không cần phải bản đồ mọi quyền cho mỗi người trong số họ. Chỉ đủ để sử dụng EXISTS truy vấn:nếu có một bản ghi, thì quyền được cấp, ngược lại - thì không. Nếu bạn cần truy xuất tất cả các quyền và trạng thái, bạn có thể sử dụng LEFT JOIN s.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để chuyển đổi thời gian MySQL sang dấu thời gian UNIX bằng PHP?

  2. đặt lại mật khẩu gốc với cấu hình mysql sai

  3. Làm cách nào để lấy tuổi từ trường D.O.B trong MySQL?

  4. MySQL để điền vào các ngày còn thiếu khi sử dụng GROUP BY DATE (table.timestamp) mà không cần tham gia vào bảng tạm thời

  5. cách lưu nội dung ckeditor trong cơ sở dữ liệu mysql