سؤال

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

لذلك ، أريد أن أعرف مكان وضع الشرط الذي سيتحقق مما إذا كان جدول المستخدم كما هو محظور = صحيح ، قبل إجراء عملية تسجيل الدخول. الآن وظيفة تسجيل الدخول الخاصة بي فارغة حيث يتم التحكم فيها تلقائيًا بواسطة مكون المصادقة.

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

المحلول

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

لذلك ، للتحقق مما إذا كان المستخدم محظورًا ، أضفت هذا السطر للتو إلى leftfilter () في AppController الخاص بي ،

$this->Auth->userScope = array('User.banned'=>0);

أمل أن هذا يساعد شخصاما.

نصائح أخرى

بدلاً من ذلك:$this->Auth->userScope = array('User.banned'=>0);

يمكن القيام بذلك عند تضمين مكون المصادقة. ربما يوفر هذا بعض الكمية الصغيرة من النفقات العامة $this->Auth->userScope لا يتم استدعاؤه في كل مرة يتم فيها تحليل وحدة التحكم.

public $components = array(
    'Auth' => array(
        'authenticate' => array(
            'Form' => array(
                'passwordHasher' => 'Blowfish',
                'scope' => array('User.banned' => 0)
            )
        ),
        'authorize' => array('Controller')
    )
);

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

إذا لم يكن ذلك كافياً ، فيمكنك إضافة الكود أدناه.

function login() {
  if ($this->Session->read('Auth.User')) {
    $this->Session->setFlash('You are alreadylogged in!~~~~~~~~~~~');   
  }
  $this->Session->setFlash('You have been banned!');    
  $this->redirect(array('controller'=>'users','action'=>'index'));
}

تحرير 1: للحصول على نهج أكثر ديناميكيًا كما أشرت في تعليقك ، يمكنك التحقق UsersController::beforeFilter() وضبط رسالة الفلاش وفقًا لذلك. قم أيضًا بإعادة توجيه بناءً على نتائج $this->Session->read('Auth.User.is_banned'). ربما تريد إلقاء نظرة على إخراج <?php debug $this->Session->read('Auth.User) ?> قبل مهاجمة مشكلتك.

تحرير 2: خطأي. يمكنك تخزين IS_BINTING في مكان ما في الجلسة عبر $this->Session->write(...). بعد قراءة is_banned = true يمكنك تسجيل المستخدم.

عليك استخدام:

/** Function is executed after the login*/
function isAuthorized() {
return true;
}

حيث يمكنك التحقق مما إذا كان المستخدم محظورًا أم لا. بمعنى آخر

/** Function is executed after the login*/
function isAuthorized() {
if($this->Auth->user('banned') == 1){ //column banned should be in the users table
       $this->Session->setFlash('You have been banned!');    
       return false;
    }
    return true;
}

أعتقد أن هذه هي الطريقة الصحيحة.

بعد قراءة تعليقك الأخير على طريق Nik ، أعتقد أنه يمكنك فقط تحسين الحل الأصلي عن طريق تسجيل المستخدم يدويًا عبر $ this-> upit-> logout () في المكان المناسب في الكود الخاص بك (تليها إعادة توجيه). وبهذه الطريقة يجب أن يبدو أنه/لم تسجل الدخول.

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