2

我有一些代码可以防止已删除和禁止的用户登录。为了清除头脑,状态为 -2 意味着用户被删除,-1 意味着用户被禁止。下面是在本地运行良好的代码,但在现场它很烂。状态为 -1 或 -2 的用户仍然可以登录。我找不到问题出在哪里。

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
}
4

2 回答 2

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
}
于 2012-08-07T01:48:52.430 回答
2

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

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

该行应为

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

这是在条件数组中添加比较运算符的典型 cakephp 方式

(我本来只是对此发表评论,但是当您刚接触该网站时,更容易创建答案。)

于 2014-08-11T20:22:49.883 回答