Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

उपयोगकर्ता खाता प्रबंधन, भूमिकाएँ, अनुमतियाँ, प्रमाणीकरण PHP और MySQL -- भाग 5

यह PHP में उपयोगकर्ता खाता प्रबंधन प्रणाली बनाने के तरीके पर एक श्रृंखला का भाग 5 है। आप अन्य भागों को यहां देख सकते हैं:भाग 1, भाग 2, भाग 3 और भाग 4।

हमने पिछले अनुभाग के साथ-साथ भूमिकाओं में प्रशासनिक उपयोगकर्ता खातों को प्रबंधित करना समाप्त कर दिया है। इस भाग में, हम अनुमतियां बनाने और उपयोगकर्ता भूमिकाओं के लिए अनुमतियां असाइन और अन-असाइन करने के माध्यम से जाएंगे।

भूमिकाओं को अनुमतियां सौंपना

जैसा कि मैंने इस श्रृंखला के पहले भाग में कहा, भूमिकाएँ अनेक-से-अनेक संबंध में अनुमतियों से संबंधित हैं। एक भूमिका में कई अनुमतियाँ हो सकती हैं और एक अनुमति कई भूमिकाओं से संबंधित हो सकती है।

हम पहले ही रोल्स टेबल बना चुके हैं। अब हम अनुमतियों को रखने के लिए एक अनुमति तालिका और भूमिकाओं और अनुमति तालिका के बीच संबंधों के बारे में जानकारी रखने के लिए अनुमति_रोल नामक एक तीसरी तालिका बनाएंगे।

निम्नलिखित गुण रखने के लिए दो तालिकाएँ बनाएँ:

अनुमति तालिका:

CREATE TABLE `permissions` (
 `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
 `name` varchar(255) NOT NULL UNIQUE KEY,
 `description` text NOT NULL
)

अनुमति_भूमिका तालिका:

CREATE TABLE `permission_role` (
 `id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
 `role_id` int(11) NOT NULL,
 `permission_id` int(11) NOT NULL,
 KEY `role_id` (`role_id`),
 KEY `permission_id` (`permission_id`),
 CONSTRAINT `permission_role_ibfk_1` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `permission_role_ibfk_2` FOREIGN KEY (`permission_id`) REFERENCES `permissions` (`id`)
)

अनुमति_रोल तालिका पर, role_id भूमिका तालिका पर भूमिका आईडी का संदर्भ देता है जबकि अनुमति_आईडी अनुमति तालिका पर अनुमति आईडी कॉलम का संदर्भ देता है। किसी भूमिका को अनुमति देने के लिए, हम केवल उस allow_id के रिकॉर्ड को role_id के सामने allow_role टेबल पर डालने से करते हैं और संबंध स्थापित हो जाता है। इसका मतलब है कि अगर हम उस भूमिका से उस अनुमति को अन-असाइन करना चाहते हैं, तो हम इस अनुमति_रोल टेबल पर उस अनुमति_आईडी के खिलाफ उस role_id के रिकॉर्ड को हटा देते हैं।

उपरोक्त SQL क्वेरी की अंतिम दो पंक्तियाँ ऐसी बाधाएँ हैं जो यह सुनिश्चित करती हैं कि जब कोई विशेष भूमिका या अनुमति हटा दी जाती है, तो उस अनुमति की आईडी या उस भूमिका आईडी वाली allow_role तालिका की सभी प्रविष्टियाँ भी डेटाबेस द्वारा स्वचालित रूप से हटा दी जाएंगी। हम ऐसा इसलिए करते हैं क्योंकि हम नहीं चाहते कि किसी भूमिका या अनुमति के बारे में संबंध जानकारी रखने वाली अनुमति_भूमिका तालिका अब मौजूद नहीं है।

आप इन बाधाओं को मैन्युअल रूप से PHPMyAdmin का उपयोग करके भी सेट कर सकते हैं:आप इसे इंटरफ़ेस पर केवल अनुमति_रोल तालिका का चयन करके और रिलेशनल व्यू> स्ट्रक्चर टैब पर जाकर और केवल मानों को भरकर कर सकते हैं। अगर आप अभी भी ऐसा नहीं कर सकते हैं, तो नीचे एक टिप्पणी छोड़ें और मैं आपकी मदद करने की कोशिश करूंगा।

अब रिश्ता तय हो गया है।

आइए भूमिका के लिए अनुमतियाँ असाइन करने के लिए एक पृष्ठ बनाएँ। हमारे roleList.php पृष्ठ पर, हम प्रत्येक के साथ एक 'अनुमतियाँ' बटन के साथ विभिन्न भूमिकाओं को सूचीबद्ध करते हैं। इस लिंक पर क्लिक करने से हम एक पेज पर पहुंच जाएंगे, जिसे असाइनप्रमिशन्स.php कहा जाता है। चलिए अब उस फाइल को एडमिन/रोल्स फोल्डर के अंदर बनाते हैं।

असाइन करें अनुमतियाँ.php:

<?php include('../../config.php') ?>
<?php include(ROOT_PATH . '/admin/roles/roleLogic.php') ?>
<?php
  $permissions = getAllPermissions();
  if (isset($_GET['assign_permissions'])) {
    $role_id = $_GET['assign_permissions']; // The ID of the role whose permissions we are changing
    $role_permissions = getRoleAllPermissions($role_id); // Getting all permissions belonging to role

    // array of permissions id belonging to the role
    $r_permissions_id = array_column($role_permissions, "id");
  }
?>
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Admin Area - Assign permissions </title>
  <!-- Bootstrap CSS -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" />
  <!-- Custome styles -->
  <link rel="stylesheet" href="../../static/css/style.css">
</head>
<body>
  <?php include(INCLUDE_PATH . "/layouts/admin_navbar.php") ?>
  <div class="col-md-4 col-md-offset-4">
    <a href="roleList.php" class="btn btn-success">
      <span class="glyphicon glyphicon-chevron-left"></span>
      Roles
    </a>
    <hr>
    <h1 class="text-center">Assign permissions</h1>
    <br />
    <?php if (count($permissions) > 0): ?>
    <form action="assignPermissions.php" method="post">
      <table class="table table-bordered">
        <thead>
          <tr>
            <th>N</th>
            <th>Role name</th>
            <th class="text-center">Status</th>
          </tr>
        </thead>
        <tbody>
          <?php foreach ($permissions as $key => $value): ?>
            <tr class="text-center">
              <td><?php echo $key + 1; ?></td>
              <td><?php echo $value['name']; ?></td>
              <td>
                  <input type="hidden" name="role_id" value="<?php echo $role_id; ?>">
                  <!-- if current permission id is inside role's ids, then check it as already belonging to role -->
                  <?php if (in_array($value['id'], $r_permissions_id)): ?>
                    <input type="checkbox" name="permission[]" value="<?php echo $value['id'] ?>" checked>
                  <?php else: ?>
                    <input type="checkbox" name="permission[]" value="<?php echo $value['id'] ?>" >
                  <?php endif; ?>
              </td>
            </tr>
          <?php endforeach; ?>
          <tr>
            <td colspan="3">
              <button type="submit" name="save_permissions" class="btn btn-block btn-success">Save permissions</button>
            </td>
          </tr>
        </tbody>
      </table>
    </form>
    <?php else: ?>
      <h2 class="text-center">No permissions in database</h2>
    <?php endif; ?>
  </div>
  <?php include(INCLUDE_PATH . "/layouts/footer.php") ?>
</body>
</html>

किसी भूमिका के 'अनुमतियाँ' बटन पर क्लिक करने से आप इस पृष्ठ पर पहुँच जाते हैं। लेकिन अभी अगर आप इस पर क्लिक करते हैं और इस असाइनमेंट पर आते हैं। इस विधि को जोड़ने से पहले, आइए देखें कि हम वास्तव में अपने PHP कोड में अनुमति के इस असाइनमेंट और अन-असेसिंग को कैसे लागू करते हैं।

जब आप किसी भूमिका के 'अनुमतियाँ' बटन पर क्लिक करते हैं, तो आपको उस भूमिका की आईडी के साथ असाइनप्रमिशन.php पृष्ठ पर ले जाया जाता है। लेकिन असाइन करें अनुमतियां पृष्ठ प्रदर्शित करने से पहले, हम डेटाबेस से उस भूमिका को पहले से असाइन की गई सभी अनुमतियां प्राप्त करने के लिए भूमिका आईडी का उपयोग करते हैं। और फिर हम अनुमति तालिका में उपलब्ध सभी अनुमतियों को भी बाहर लाते हैं। अब हमारे पास अनुमतियों की दो सरणियाँ हैं:एक जिन्हें एक भूमिका सौंपी गई है और सभी अनुमतियाँ हमारे डेटाबेस में उपलब्ध हैं। एक पूर्व बाद वाले का सबसेट है।

किसी भूमिका को अनुमति देने का अर्थ है अनुमतियों की समग्र सूची से उस अनुमति को उस भूमिका से संबंधित अनुमति की सरणी में जोड़ना और इस संपूर्ण जानकारी को अनुमति_रोल तालिका में सहेजना। किसी भूमिका से अनुमति को अन-असाइन करने का अर्थ है उस भूमिका से संबंधित अनुमतियों की सूची से उस विशेष अनुमति को हटाना।

हमारा तर्क डेटाबेस से सभी उपलब्ध अनुमतियों की एक सरणी के माध्यम से लूप करना है, फिर उनकी प्रत्येक आईडी के लिए, हम यह निर्धारित करते हैं कि क्या आईडी पहले से ही भूमिका की अनुमति के लिए आईडी की सरणी में है। यदि यह मौजूद है, तो इसका मतलब है कि भूमिका के पास पहले से ही वह अनुमति है इसलिए हम इसे चेक किए गए चेकबॉक्स के साथ प्रदर्शित करते हैं। यदि यह मौजूद नहीं है, तो हम इसे एक अनियंत्रित चेकबॉक्स के साथ प्रदर्शित करते हैं।

सब कुछ प्रदर्शित होने के बाद, चेक किए गए चेकबॉक्स पर क्लिक करने का अर्थ है अनुमति को अन-असाइन करना जबकि अनचेक चेकबॉक्स पर क्लिक करने का अर्थ है भूमिका को अनुमति देना। सभी चेकिंग और अनचेकिंग के बाद, उपयोगकर्ता उस भूमिका के लिए चेक की गई सभी अनुमतियों को सहेजने के लिए तालिका के नीचे 'अनुमतियां सहेजें' बटन पर क्लिक करता है।

आइए इन सभी कार्यों को roleLogic.php फ़ाइल में जोड़ें। वे हैं:

roleLogic.php:

// ... other functions up here ...
  function getAllPermissions(){
    global $conn;
    $sql = "SELECT * FROM permissions";
    $permissions = getMultipleRecords($sql);
    return $permissions;
  }

  function getRoleAllPermissions($role_id){
    global $conn;
    $sql = "SELECT permissions.* FROM permissions
            JOIN permission_role
              ON permissions.id = permission_role.permission_id
            WHERE permission_role.role_id=?";
    $permissions = getMultipleRecords($sql, 'i', [$role_id]);
    return $permissions;
  }

  function saveRolePermissions($permission_ids, $role_id) {
    global $conn;
    $sql = "DELETE FROM permission_role WHERE role_id=?";
    $result = modifyRecord($sql, 'i', [$role_id]);

    if ($result) {
      foreach ($permission_ids as $id) {
        $sql_2 = "INSERT INTO permission_role SET role_id=?, permission_id=?";
        modifyRecord($sql_2, 'ii', [$role_id, $id]);
      }
    }

    $_SESSION['success_msg'] = "Permissions saved";
    header("location: roleList.php");
    exit(0);
  }

अनुमतियों को काम पर लाना

इस बिंदु पर, हम यह निर्धारित कर सकते हैं कि उपयोगकर्ता की भूमिका क्या है और चूंकि भूमिका अनुमतियों से संबंधित है, इसलिए हम उनकी अनुमतियों को भी जान सकते हैं।

अब हम इन अनुमतियों को काम में लाना चाहते हैं:यानी, यह सुनिश्चित करने के लिए कि एक व्यवस्थापक उपयोगकर्ता को केवल उन्हीं कार्यों को करने की अनुमति है जिनके लिए उसके पास अनुमतियां हैं। हम इसे मिडलवेयर फ़ंक्शंस का उपयोग करके प्राप्त करेंगे। एक मिडलवेयर मूल रूप से कोड का एक टुकड़ा या एक फ़ंक्शन होता है जो किसी क्रिया को करने से पहले निष्पादित हो जाता है। आम तौर पर, यह मिडलवेयर फ़ंक्शन कार्रवाई के व्यवहार को संशोधित कर सकता है या कुछ जांच कर सकता है जो जांच के परिणामों के आधार पर कार्रवाई को पूरी तरह से रोक सकता है।

उदाहरण के लिए, उपयोगकर्ता के पास क्रिएट-पोस्ट, अपडेट-पोस्ट और डिलीट-पोस्ट की अनुमति हो सकती है। यदि वे लॉग इन हैं और वे एक पोस्ट प्रकाशित करने का प्रयास करते हैं, तो हमारा मिडलवेयर फ़ंक्शन पहले यह देखने के लिए जांच करता है कि इस उपयोगकर्ता के पास प्रकाशन-पोस्ट अनुमति है या नहीं। यदि उनके पास यह अनुमति है, तो हमारा मिडलवेयर फ़ंक्शन सही हो जाएगा और पोस्ट प्रकाशित हो जाएगी। यदि उनके पास पब्लिश-पोस्ट की अनुमति नहीं है, तो हमारा मिडलवेयर फ़ंक्शन उन्हें एक संदेश के साथ वापस रीडायरेक्ट करेगा, जिसमें कहा जाएगा कि उनके पास पोस्ट प्रकाशित करने की अनुमति नहीं है।

हम अपने सभी मिडलवेयर कार्यों को मिडलवेयर.php नामक एक फाइल के अंदर रखेंगे। इसे अभी व्यवस्थापक फ़ोल्डर में बनाएं और इस कोड को इसमें पेस्ट करें:

मिडलवेयर.php:

<?php

  // if user is NOT logged in, redirect them to login page
  if (!isset($_SESSION['user'])) {
    header("location: " . BASE_URL . "login.php");
  }
  // if user is logged in and this user is NOT an admin user, redirect them to landing page
  if (isset($_SESSION['user']) && is_null($_SESSION['user']['role'])) {
    header("location: " . BASE_URL);
  }
  // checks if logged in admin user can update post
  function canUpdatePost($post_id = null){
    global $conn;

    if(in_array('update-post', $_SESSION['userPermissions'])){
      if ($_SESSION['user']['role'] === "Author") { // author can update only posts that they themselves created
          $sql = "SELECT user_id FROM posts WHERE id=?";
          $post_result = getSingleRecord($sql, 'i', [$post_id]);
          $post_user_id = $post_result['user_id'];

          // if current user is the author of the post, then they can update the post
          if ($post_user_id === $user_id) {
            return true;
          } else { // if post is not created by this author
            return false;
          }
      } else { // if user is not author
        return true;
      }
    } else {
      return false;
    }
  }

  // accepts user id and post id and checks if user can publis/unpublish a post
  function canPublishPost() {
    if(in_array(['permission_name' => 'publish-post'], $_SESSION['userPermissions'])){
      // echo "<pre>"; print_r($_SESSION['userPermissions']); echo "</pre>"; die();
      return true;
    } else {
      return false;
    }
  }

  function canDeletePost() {
    if(in_array('delete-post', $_SESSION['userPermissions'])){
      return true;
    } else {
      return false;
    }
  }
  function canCreateUser() {
    if(in_array('create-user', $_SESSION['userPermissions'])){
      return true;
    } else {
      return false;
    }
  }
  function canUpdateUser() {
    if(in_array('update-user', $_SESSION['userPermissions'])){
      return true;
    } else {
      return false;
    }
  }
  function canDeleteUser() {
    if(in_array('delete-user', $_SESSION['userPermissions'])){
      return true;
    } else {
      return false;
    }
  }
  function canCreateRole($role_id) {
    if(in_array('create-role', $_SESSION['userPermissions'])){
      return true;
    } else {
      return false;
    }
  }
  function canUpdateRole($role_id) {
    if(in_array('update-role', $_SESSION['userPermissions'])){
      return true;
    } else {
      return false;
    }
  }
  function canDeleteRole($user_id, $post_id) {
    if(in_array('delete-role', $_SESSION['userPermissions'])){
      return true;
    } else {
      return false;
    }
  }
?>
"; मरना(); सच लौटना; } और { झूठी वापसी; } } फंक्शन canDeletePost() {if(in_array('delete-post', $_SESSION['userPermissions'])){ return true; } और { झूठी वापसी; } } फंक्शन canCreateUser() {if(in_array('create-user', $_SESSION['userPermissions'])){ return true; } और { झूठी वापसी; } } फंक्शन canUpdateUser() {if(in_array('update-user', $_SESSION['userPermissions'])){ return true; } और { झूठी वापसी; } } फंक्शन canDeleteUser() {if(in_array('delete-user', $_SESSION['userPermissions'])){ return true; } और { झूठी वापसी; } } फंक्शन canCreateRole($role_id) { if(in_array('create-role', $_SESSION['userPermissions'])){ return true; } और { झूठी वापसी; } } फंक्शन canUpdateRole($role_id) {if(in_array('update-role', $_SESSION['userPermissions'])){ return true; } और { झूठी वापसी; } } फंक्शन canDeleteRole($user_id, $post_id) { if(in_array('delete-role', $_SESSION['userPermissions'])){ return true; } और { झूठी वापसी; } }?>

यदि उपयोगकर्ता लॉग इन है या नहीं, तो पहला स्टेटमेंट चेक करता है। यदि उपयोगकर्ता लॉग इन नहीं है, तो उन्हें होमपेज पर रीडायरेक्ट कर दिया जाएगा। दूसरा यदि कथन जाँचता है कि उपयोगकर्ता लॉग इन है या नहीं और क्या उसकी कोई भूमिका है (व्यवस्थापक है)। यदि उपयोगकर्ता को लॉग इन पाया जाता है और उसकी कोई भूमिका है, तो वे पृष्ठ तक पहुंचेंगे, अन्यथा उसे मुखपृष्ठ पर वापस भेज दिया जाएगा।

प्रत्येक फ़ाइल में जहाँ आप गैर-व्यवस्थापक उपयोगकर्ताओं को एक्सेस करने से प्रतिबंधित करना चाहते हैं, आपको बस इस मिडलवेयर.php फ़ाइल को उस फ़ाइल में शामिल करना चाहिए। इसलिए हमारी सभी एडमिन फाइल्स जिनमें हम नहीं चाहते कि नॉर्मल यूजर्स एक्सेस करें, हम उनमें इस फाइल को शामिल कर लेंगे। तो व्यवस्थापक फ़ोल्डर के अंदर दो फ़ोल्डरों में सभी फाइलें खोलें अर्थात्:उपयोगकर्ता, भूमिकाएं। प्रत्येक फ़ाइल में, config.php के लिए शामिल के ठीक नीचे निम्न पंक्ति जोड़ें।

इस तरह:

<?php include('../../config.php'); ?>
<?php require_once '../middleware.php'; ?>

और वह किसी भी गैर-व्यवस्थापक उपयोगकर्ता को पृष्ठ पर जाने का प्रयास करने पर पुनर्निर्देशित करेगा।

साथ ही इस मिडलवेयर.php फ़ाइल में, हम यह जांचने के लिए PHP के in_array() का उपयोग कर रहे हैं कि हम जिस अनुमति का परीक्षण कर रहे हैं वह उस उपयोगकर्ता की अनुमतियों की सरणी में है या नहीं। (जब कोई व्यवस्थापक उपयोगकर्ता लॉग इन करता है, तो हम उनकी सभी अनुमति $_SESSION['userPermissions'] नामक सत्र चर सरणी में डालते हैं।) यदि वर्तमान अनुमति उपयोगकर्ता की अनुमतियों की सरणी में है, तो इसका मतलब है कि उस उपयोगकर्ता के पास वह अनुमति है और इसलिए फ़ंक्शन सही है, अन्यथा यह गलत है।

अब यदि आप यह जांचना चाहते हैं कि किसी उपयोगकर्ता के पास अनुमति है या नहीं, तो कहें कि एक प्रकाशन-पोस्ट अनुमति जो आपको करनी है, वह है इस तरह canPublishPost() विधि को कॉल करें:

<?php if (canPublishPost()): ?>
	<!-- User can publish post. Display publish post button -->
<?php else: ?>
	<!-- User cannot publish post. Do not display publish post button -->
<?php endif ?>

एक मिडलवेयर के रूप में, किसी पोस्ट को अपडेट करने से पहले, हम सबसे पहले canUpdatePost() मिडलवेयर फ़ंक्शन को कॉल करेंगे। यदि फ़ंक्शन जांचता है और देखता है कि उपयोगकर्ता के पास अपडेट-पोस्ट की अनुमति नहीं है, तो यह झूठी वापसी करेगा और फिर हम उन्हें एक संदेश के साथ होमपेज पर रीडायरेक्ट कर सकते हैं, जिसमें कहा गया है कि उन्हें पोस्ट को अपडेट करने की अनुमति नहीं है। इस तरह:

// checks if logged in admin user can update post
function updatePost($post_values){
  global $conn;

  if(canUpdatePost($post_values['id']){
     // proceed to update post
  
  } else {
    // redirect back to homepage with message that says user is not permitted to update post
  }
}

पोस्ट प्रकाशित/अप्रकाशित करने के लिए एक ही बात:

function togglePublishPost($post_id)
{
	if (!canPublishPost($_SESSION['user']['id'])) {
		// redirect them back to dashboard with the message that they don't have the permission to publish post
	} 
    
    // proceed to publish post

}

अब हमारे पास इस ट्यूटोरियल का अंतिम भाग बचा है जो उपयोगकर्ता प्रोफ़ाइल को अपडेट कर रहा है और पंजीकृत उपयोगकर्ताओं को अपने स्वयं के खातों को हटाने की क्षमता भी दे रहा है।

निम्नलिखित के लिए धन्यवाद। अगर आपको कुछ कहना है, तो कृपया उसे टिप्पणियों में छोड़ दें।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. दिनांक सीमा से दिन उत्पन्न करें

  2. MYSQL जॉइन स्टेटमेंट के अंदर MAX डेट चुनें

  3. MySQL पर MySQLi के लाभ

  4. तालिका बनाने में 1064 त्रुटि ... TYPE=MYISAM

  5. MySQL को ORDER BY में पंक्ति स्थिति मिलती है