sql >> データベース >  >> RDS >> Mysql

階層的な役割ベースのアクセス制御システムを設計する方法

    テーブル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。




    1. MySQLでの全文検索は行を返しません

    2. mysqlのSETautocommit=1とSTARTTRANSACTIONの違い(何かを逃したことがありますか?)

    3. OSXにmysqlgemをインストールできません

    4. Oracleで正規表現によってコンマ区切りのリストから重複を削除するにはどうすればよいですか?重複する値は必要ありませんか?