Я хочу запретить заблокированным пользователям входить на сайт и сообщать им, что они забанены. Я попытался использовать isAuthorized () для этого, но он позволяет пользователю войти в систему и только после этого отказывает ему в разрешении на несанкционированные действия.
Итак, в основном я хочу знать, где поставить условие, которое проверит, если таблица пользователя as banned = true, до того, как произойдет вход в систему. Прямо сейчас моя функция входа в систему пуста, так как она автоматически контролируется Компонентом Auth.
Наконец-то я нашел решение через API. Интересно, использовал ли кто-нибудь это когда-либо, потому что никто не указал мне на это, или, может быть, я недостаточно ясно выразился. В любом случае, чтобы добавить условие к процессу входа в систему, вы просто поместили его в переменную $this->Auth->userScope
Итак, чтобы проверить, забанен ли пользователь, я просто добавил эту строку в beforeFilter() в моем AppController,
$this->Auth->userScope = array('User.banned'=>0);
Надеюсь, это кому-нибудь поможет.
вы должны использовать:
/** 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;
}
Я считаю, что это правильный путь.
Если у вас уже установлена и работает вся система аутентификации, почему бы вам просто не следовать принципу 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
вы можете выйти из системы.
Прочитав ваш последний комментарий о способе Ника, я думаю, что вы могли бы просто улучшить исходное решение, выполнив вход пользователя вручную через $this->Auth->logout() в соответствующем месте. в вашем коде (с последующим перенаправлением). Таким образом, должно выглядеть так, будто он/она никогда не входил в систему.