Mysql
 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 write लिखें Roles . पर अनुमतियां session . के लिए अनुमतियां ।

साथ ही, मैं grant को हटाने का सुझाव देता हूं Permission_Role . में कॉलम और Permission_User . मानचित्र की कोई आवश्यकता नहीं है उनमें से प्रत्येक के लिए हर अनुमति। बस EXISTS का उपयोग करने के लिए पर्याप्त है प्रश्न:यदि कोई रिकॉर्ड है, तो अनुमति दी गई है, अन्यथा - ऐसा नहीं है। यदि आपको सभी अनुमतियों और स्थितियों को पुनः प्राप्त करने की आवश्यकता है, तो आप LEFT JOIN . का उपयोग कर सकते हैं एस.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL समय प्रकार एक ArgumentError देता है:24 घंटे से अधिक होने पर रेल में सीमा से बाहर तर्क

  2. एडब्ल्यूएस आरडीएस के साथ हरोकू ऐप पर Mysql2 ::त्रुटि (एसएसएल कनेक्शन त्रुटि:एएसएन:खराब अन्य हस्ताक्षर पुष्टिकरण) प्राप्त करना

  3. MySQL क्वेरी में टेबल नाम के आसपास बैकटिक का महत्व

  4. जांचें कि क्या लार्वा मॉडल सहेजा गया है या क्वेरी निष्पादित हुई है

  5. MySQL - उन पंक्तियों का चयन कैसे करें जहाँ मान सरणी में है?