CakePHP Auth Component Проверка пользователя перед входом - PullRequest
6 голосов
/ 25 августа 2010

Я хочу запретить заблокированным пользователям входить на сайт и сообщать им, что они забанены.Я попытался использовать isAuthorized () для этого, но он позволяет пользователю войти в систему и только после этого отказывает ему в разрешении несанкционированных действий.

Итак, в основном я хочу знать, где поставить условие, которое проверяетпользовательская таблица как banned = true, до того, как произойдет вход в систему.Сейчас моя функция входа в систему пуста, так как она автоматически контролируется Компонентом Auth.

Ответы [ 5 ]

12 голосов
/ 26 августа 2010

Наконец, я нашел решение, пройдя через API.Интересно, кто-нибудь когда-либо использовал это, потому что никто не указал мне на это, или, может быть, я не был достаточно ясен.В любом случае, чтобы добавить условие в процесс входа в систему, вы просто поместили его в переменную $ this-> Auth-> userScope

Итак, чтобы проверить, забанен ли пользователь, я просто добавил эту строку в beforeFilter () в моем контроллере приложений,

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

Надеюсь, это кому-нибудь поможет.

6 голосов
/ 08 сентября 2014

В качестве альтернативы: $this->Auth->userScope = array('User.banned'=>0);

Это может быть сделано при включении компонента Auth.Это, вероятно, экономит некоторое количество накладных расходов, поскольку $this->Auth->userScope не вызывается при каждом анализе контроллера.

public $components = array(
    'Auth' => array(
        'authenticate' => array(
            'Form' => array(
                'passwordHasher' => 'Blowfish',
                'scope' => array('User.banned' => 0)
            )
        ),
        'authorize' => array('Controller')
    )
);
3 голосов
/ 25 августа 2010

Если у вас уже запущена и работает вся система аутентификации, почему бы вам просто не следовать принципу KISS и отозвать его пароль или не изменить имя пользователя? Если они больше не могут проходить аутентификацию в вашей системе, как раньше, они могут сделать вывод, что они забанены.

Если этого недостаточно, вы можете добавить код ниже.

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: Для более динамичного подхода, как вы указали в своем комментарии, вы можете проверить столбец is_banned рассматриваемой пользовательской записи в вашем UsersController::beforeFilter() и соответственно настроить ваше флеш-сообщение. Также сделайте перенаправление на основе результата $this->Session->read('Auth.User.is_banned'). Возможно, вы захотите взглянуть на вывод <?php debug $this->Session->read('Auth.User) ?> перед тем, как приступить к решению проблемы.

Редактировать 2: Моя вина. Вы можете хранить is_banned где-нибудь в сеансе через $this->Session->write(...). После прочтения is_banned = true вы можете выйти из системы.

2 голосов
/ 25 августа 2010

вы должны использовать:

/** 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;
}

Я считаю, что это правильный путь.

1 голос
/ 25 августа 2010

Прочитав ваш последний комментарий о способе Ника, я думаю, что вы могли бы просто уточнить исходное решение, выполнив ручной выход пользователя из системы через $ this-> Auth-> logout () в соответствующем месте в вашем коде (за которым следуетперенаправление).Таким образом, это должно выглядеть так, будто он никогда не входил в систему.

...