CakePHP Auth Component Проверка пользователя перед входом в систему

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

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

6
задан Atul Dravid 25 August 2010 в 09:49
поделиться

4 ответа

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

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

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

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

13
ответ дан 8 December 2019 в 04:27
поделиться

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

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

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

2
ответ дан 8 December 2019 в 04:27
поделиться

Если у вас уже установлена ​​и работает вся система аутентификации, почему бы вам просто не следовать принципу 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'). Может быть, вы хотите взглянуть на вывод Session->read('Auth.User) ?>, прежде чем приступить к решению вашей проблемы.

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

3
ответ дан 8 December 2019 в 04:27
поделиться

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

1
ответ дан 8 December 2019 в 04:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: