سؤال

لقد حاولت القيام بذلك عدة مرات دون جدوى.بعد القراءة هذا المشنور, لقد جعلني مهتمًا بفعل ذلك مرة أخرى.فهل يمكن لأحد أن يقول لي لماذا لا يعمل ما يلي؟

<?php

$guest = 1;
$editor = 2;
$admin = 4;

$user = $editor;

if( $user == ($editor | $admin) ) {
    echo "Test";    
}

?>
هل كانت مفيدة؟

المحلول

استخدم عامل البت OR (|) لتعيين البتات، واستخدم عامل التشغيل AND (&) للتحقق من البتات.يجب أن يبدو الرمز الخاص بك كما يلي:

<?php

    $guest = 1;
    $editor = 2;
    $admin = 4;

    $user = $editor;

    if( $user & ($editor | $admin) ) {
        echo "Test";    
    }

?>

إذا كنت لا تفهم النظام الثنائي وما تفعله معاملات البت بالضبط، فيجب عليك تعلم ذلك.ستفهم كيفية القيام بذلك بشكل أفضل.

نصائح أخرى

من أجل عدم إعادة اختراع العجلة، لماذا لا نلقي نظرة على أنظمة ACL/المصادقة مثل زند الرباط الصليبي الأمامي و مصادقة زند؟يمكن استخدام كلاهما بشكل مستقل عن Zend Framework ككل.يعد التحكم في الوصول موقفًا صعبًا لذا فمن المفيد أن ينظر المرء على الأقل إلى كيفية قيام الأنظمة الأخرى بذلك.

لقد مر وقت طويل منذ أن استخدمت PHP، ولكنني سأفترض أن هذا سينجح:

<?php

    $guest = 1;
    $editor = 2;
    $admin = 4;

    $user = $editor;

    if( ($user == $editor) || ($user == $admin) ) {
        echo "Test";    
    }

?>

لقد استخدمت هذا في الإبلاغ عن الأخطاء وهو يعمل بشكل جيد.أما بالنسبة لأذونات المستخدم، فيجب أن تعمل بشكل جيد للغاية - يمكن أن يكون لديك عدة أعمدة لكل إذن مستخدم في قاعدة البيانات الخاصة بك أو عمود واحد على مستوى المستخدم في قاعدة البيانات الخاصة بك.الذهاب لهذا الخيار.

(2 | 4) قيمته 6، لكن 2 == 6 خطأ.

@مك:(2 | 4) يصل إلى 6.

$guest = 1;
$editor = 2;
$admin = 4;

$user = $editor;

if (user == $editor || $user == $admin) {
    echo "Test";
}

رائع، يبدو أن هذه هي أفضل طريقة للحصول على الأذونات في نظام إدارة المحتوى (CMS).نعم؟لا؟

ربما، لم أفعل ذلك بهذه الطريقة أبدًا.ما قمت به هو استخدام معاملات البت لتخزين مجموعة كاملة من إعدادات "نعم أو لا" في رقم واحد في عمود واحد في قاعدة البيانات.

أعتقد أن هذه الطريقة ستكون جيدة بالنسبة للأذونات إذا كنت تريد تخزين الأذونات في قاعدة البيانات.إذا أراد شخص ما نشر بعض المحتوى، ويريد أن يراه فقط المسؤولون والمحررون، فما عليك سوى تخزين نتيجة ذلك

 ($editor | $admin)

في قاعدة البيانات، ثم للتحقق من ذلك، افعل شيئًا مثل

 if ($user & $database_row['permissions']) {
       // display content
 } else {
       // display permissions error
 }

في رأيي هذا لا يتسع بشكل جيد.لم أحاول في الواقع استخدامه في مشروع واسع النطاق، ولكن يبدو استخدام نظام إدارة المحتوى (CMS) طريقة معقدة للغاية.

يعتمد الأمر دائمًا على ما تحتاجه.إذا كنت تعرف إطار عمل Zend بالفعل، فأنا أؤيد اقتراح Zend_Acl/_Auth الذي تم تقديمه سابقًا.لكن ضع في اعتبارك أن كل إطار عمل يأتي بمكون مماثل.

والشيء الآخر الذي يتبادر إلى الذهن هو LiveUser.أحب العمل معها كثيرًا أيضًا.

أعتقد أنه يمكنك فعل أي شيء تقريبًا، وعلى الرغم من أن أسلوبك يبدو بسيطًا جدًا، إلا أنه محدود أيضًا لأنك (من خلال كل تلك if()'s) ستضع الكثير من منطق ACL في منتصف تطبيقك.وهذا ليس أعظم شيء يجب القيام به من أجل إبقائه بسيطًا وقابلاً للتوسيع.;)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top