Ada cara untuk mengimplementasikan pewarisan peran dengan menggunakan relasi rekursif pada tabel Roles
, dengan membuat referensi peran ke catatan lain:
Relasi ini akan menambahkan 1 : n
warisan dalam Roles
catatan. Anda mungkin mendapatkan seluruh hierarki pohon dengan fungsi tersimpan ini:
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
Kemudian, Anda mungkin mendapatkan semua diberikan izin dengan sesuatu seperti ini:
SELECT
`permission_id`
FROM
`Permission_Role`
WHERE
FIND_IN_SET(`role_id`, `getHierarchy`({$role}))
AND
grant;
Jika tidak cukup, Anda dapat membuat tabel lain untuk pewarisan:
Namun, dalam hal ini, diperlukan algoritma perolehan hierarki yang lain.
Untuk mengatasi mengganti masalah Anda harus mendapatkan izin peran dan izin pengguna. Kemudian, tulis user
izin atas roles
izin untuk session
.
Juga, saya sarankan untuk menghapus grant
kolom di Permission_Role
dan Permission_User
. Tidak perlu memetakan setiap izin untuk mereka masing-masing. Cukup menggunakan EXISTS
pertanyaan:jika ada catatan, maka izin diberikan, jika tidak - tidak. Jika Anda perlu mengambil semua izin dan status, Anda dapat menggunakan LEFT JOIN
s.