Компонент аутентификации CakePHP проверяет пользователя перед входом в систему

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

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


person Atul Dravid    schedule 25.08.2010    source источник
comment
Как отметил @benjamin, существуют ПРОСТЫЕ стратегии самопроверки... Самые простые, по адресу controller или view_file.ctp, равно if ( $this->Session->check('Auth.User') ) doSomeThing().   -  person Peter Krauss    schedule 20.11.2012
comment
Для тех, кто пришел сюда в поисках ответа (как и я), если вы пытаетесь использовать $components напрямую, тогда имя ключа должно быть scope, а не userScope. Все кредиты на ответ @Matthew ниже.   -  person aexl    schedule 02.12.2014


Ответы (5)


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

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

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

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

person Atul Dravid    schedule 25.08.2010
comment
Это чаще пишется как $this->Auth->userScope = array('User.active' => 1); - person Chuck Burgess; 27.08.2010
comment
да одно и то же... но по крайней мере теперь я знаю куда ставить эти условия :) - person Atul Dravid; 27.08.2010
comment
Как бы вы различили неверные учетные данные и пользователь забанен, если бы вы использовали этот способ? - person Moe Sweet; 06.09.2010
comment
О каких удостоверениях вы говорите? - person Atul Dravid; 06.09.2010
comment
как отличить, если имя пользователя и пароль верны, а учетная запись человека еще не активирована по электронной почте. как при входе в систему .. можете ли вы сказать ему, что учетная запись еще не активирована, поэтому мы не впускаем его. и другая возможность: учетная запись активна, и пользователь ввел неправильный пароль или имя пользователя, скажите ему, что это неправильно, поэтому мы не пускаем его. как установить $this-›Auth-›loginError по-разному для этих двух возможностей - person Harsha M V; 10.10.2010

Альтернативно: $this->Auth->userScope = array('User.banned'=>0);

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

public $components = array(
    'Auth' => array(
        'authenticate' => array(
            'Form' => array(
                'passwordHasher' => 'Blowfish',
                'scope' => array('User.banned' => 0)
            )
        ),
        'authorize' => array('Controller')
    )
);
person Matthew    schedule 07.09.2014
comment
Спасибо @Matthew, это мне очень помогло, так как я пытался использовать userScope в качестве ключа массива. - person aexl; 02.12.2014

Если у вас уже установлена ​​и работает вся система аутентификации, почему бы вам просто не следовать принципу 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 вы можете выйти из системы.

person benjamin    schedule 25.08.2010
comment
ну ... это было бы сложно, так как я хочу, чтобы администратор мог забанить, а также разбанить пользователя, когда возникнет необходимость. изменение имени пользователя или пароля потребует от меня ведения записи о том же, если я хочу изменить его обратно на исходный. - person Atul Dravid; 25.08.2010
comment
@edit: я не уверен, как это сработает ... он даже не проверяет, установил ли пользователь запрещенное поле в значение true. - person Atul Dravid; 25.08.2010
comment
меня смущает ваш последний комментарий. я только что сделал коммит, а ваш комментарий к моему редактированию уже на месте?? - person benjamin; 25.08.2010
comment
:D комментарий к редактированию был фактически для кода функции входа в систему, который вы добавили позже. в любом случае, я попробую использовать beforeFilter(), но действительно ли я не могу сделать что-то в самой функции входа в систему? в любом случае, спасибо за помощь до сих пор. - person Atul Dravid; 25.08.2010
comment
aadravid, если честно, вам следует взглянуть на решение Niks, прежде чем переходить к моему. скорее всего, это служит вам лучше. С уважением - person benjamin; 25.08.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;
}

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

person Nik Chankov    schedule 25.08.2010
comment
ну, вот как я это делаю сейчас, но это позволяет пользователю войти в систему, а затем сообщает ему, что он забанен. Я просто хотел знать, можно ли это сделать, прежде чем войти в систему. - person Atul Dravid; 25.08.2010
comment
Ну как можно было определить, что пользователь забанен, если он не идентифицирован :) По сути в той функции надо перенаправить пользователя на действие выхода из системы (если он забанен), так он выйдет из системы сразу после поля бан проверено. - person Nik Chankov; 25.08.2010

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

person benjamin    schedule 25.08.2010
comment
вы правы ... думал о том же, и я думаю, что это самое простое решение для этого. Спасибо всем вам. - person Atul Dravid; 25.08.2010