2012-08-07 40 views
2

我有一些代码可以防止被删除和禁止的用户登录。要清除头脑,状态为-2意味着用户被删除,-1意味着用户被禁止。下面是在本地工作正常的代码,但在实际上它很糟糕。状态为-1或-2的用户仍可以登录。我找不到问题所在。CakePHP 2.x无法阻止已删除和禁止的用户登录

if ($this->Auth->login()) { 
    //first check if the user's status is -1 or -2. 
    $status = $this->Auth->user('status'); 

    if ($status == '-1') { 
     $this->Auth->logout(); 
     $this->Session->setFlash(__('This account has been banned. Please contact with us.')); 
     $this->redirect('/'); 
    } elseif ($status == '-2') { 
     $this->Auth->logout(); 
     $this->Session->setFlash(__('This account has been deleted, and is not usable anymore.')); 
     $this->redirect('/'); 
    } 

    //something else 
} 

回答

10

通过在要登录的用户检查呼叫$this->Auth->login()

你可能避免这种情况,并检查之前用户信息登录,或者您可以在状态标志添加到范围,为用户。

$this->Auth->authenticate = array(
    AuthComponent::ALL => array(
     'userModel' => 'User', 
     'scope' => array('User.status' => '> 0) 
    ), 
    'Form', 
    'Basic' 
); 

这将status字段检查添加到登录过程。

如果您希望自定义邮件作为你的榜样,您可以处理在登录前检查用户信息的值:

$user = $this->User->findByUsername($this->data['User']['username']); 
if (!empty($user)) { 
    if ($user['User']['status'] == -1) { 
     // Set message for banned account 
    } 
    if ($user['User']['status'] == -2) { 
     // Set message for deleted account 
    } 
    $this->redirect(...); // Redirect away 
} 

if ($this->Auth->login()) { 
    // Normal login process 
} 
+0

我不知道的范围键,这是2.2版本中的新功能。谢谢(你的)信息!但现在这不适合我。第二种解决方案在当地运作良好,但不在现场。我做了很多调试,但仍然无法解决问题。 – hswner 2012-08-07 02:39:00

+0

你好。现在它也可以在现场使用。我没有做任何承诺,除了删除一个缓存文件,它具有路径app/tmp/cache/persisten/myapp_cake_core_file_map。这很奇怪! – hswner 2012-08-07 02:47:35

+2

范围键对CakePHP 2并不新鲜。 – Predominant 2012-08-07 02:51:59

2

范围的回答是最好的,但有一个小错误的条件,而不是

'scope' => array('User.status' => '> 0) 

该行应

'scope' => array('User.status >' => 0) 

这是典型的CakePHP的方式在状态阵列添加比较运算符

(我刚才评论这一点,但它是更容易地创建一个答案时,新来这个网站。)