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_Role
và Permission_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.