テーブルRoles
で漸化式を使用して、ロールの継承を実装する方法があります。 、別のレコードへの役割参照を作成することによって:
この関係により、1 : n
が追加されます Roles
内の継承 記録。このストアド関数を使用して、階層ツリー全体を取得できます。
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
次に、すべての許可を取得する場合があります 次のような権限:
SELECT
`permission_id`
FROM
`Permission_Role`
WHERE
FIND_IN_SET(`role_id`, `getHierarchy`({$role}))
AND
grant;
それだけでは不十分な場合は、継承のために別のテーブルを作成することもできます:
ただし、この場合、別の階層取得アルゴリズムが必要でした。
オーバーライドを解決するには 問題は、役割のアクセス許可とユーザーのアクセス許可を取得する必要があります。次に、user
と記述します roles
に対する権限 session
への権限 。
また、grant
を削除することをお勧めします Permission_Role
の列 およびPermission_User
。 マップする必要はありません それらのそれぞれのすべての許可。 EXISTS
を使用するのに十分 クエリ:レコードがある場合は許可が付与され、そうでない場合はそうではありません。すべての権限とステータスを取得する必要がある場合は、LEFT JOIN
を使用できます。 s。