Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana merancang sistem kontrol akses berbasis peran hierarkis

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengapa menggunakan SELECT FOR UPDATE?

  2. Stempel waktu Laravel untuk ditampilkan dalam milidetik

  3. Kode Migrasi Spesifik Basis Data

  4. MySQL concurrency, bagaimana cara kerjanya dan apakah saya perlu menanganinya di aplikasi saya

  5. PHP/mysql mendapatkan jumlah baris pernyataan UPDATE yang terpengaruh