Как перенаправить на captcha для неудачной попытки x без циклических перенаправлений в CakePHP?
-
29-09-2019 - |
Вопрос
Я использую основной компонент аутентификации.Я создал логин пользователя, который управляет всеми разрешениями.Способ, которым я реализую мониторинг входа в систему, заключается в проверке наличия $this->Auth->user()
в app_controller.Каждый раз, когда app_controller выполняет цикл beforeFilter()
функция и !$this->Auth->user()
, это увеличит Captcha.LoginAttempts
переменная сеанса.Когда Captcha.LoginAttempts
если значение > 3, я хочу, чтобы оно перенаправлялось на контроллер Captchas, отображая экран captcha, требующий от пользователя подтвердить, что он человек.(Аналогично тому, как это делает stackoverflow).
Проблема, с которой я сталкиваюсь, заключается в том, что если я где-то использую элемент или ссылаюсь на что-то в рамках cake framework на странице, это приведет к перенаправлению и вызовет бесконечное циклическое перенаправление для каждого элемента доступа / компонента, вызываемого внешним по отношению к фактическому контроллеру / действию.Есть ли лучший способ реализовать это?
Вот фактический код, с которым я возился.Но это в принципе отстой (IMO):
// this is in the app_controller beforeFilter() method.
if($this->Auth->user()) {
$this->Session->delete('Captcha');
} else {
$this->Session->write('Captcha.LoginAttempts', $this->Session->read('Captcha.LoginAttempts') + 1);
if ($this->Session->read('Captcha.LoginAttempts') > 3) {
if (!$this->Session->read('Captcha.controller')) {
$this->Session->write('Captcha.controller', $this->params['controller']);
$this->Session->write('Captcha.action', $this->params['action']);
}
if ($this->Session->read('Captcha.fail') !== 'true') { // avoid circular reference redirects
$this->Session->write('Captcha.fail', 'true');
$this->redirect(array('controller' => 'captchas', 'action' => 'index'));
}
}
}
Вы можете видеть, как я стараюсь избегать циклических ссылок.Но тогда пользователь мог бы просто перейти на страницу входа в систему, и поскольку Captcha.fail
переменная сеанса уже установлена, она будет игнорировать перенаправление.Должен быть более элегантный способ реализовать это.Кто-нибудь?
Решение
Обычно я бы просто попытался ответить так, как вы пытаетесь это сделать, но поскольку вы попросили какие-либо идеи получше, что я бы сделал, так это разместил Captcha фактически на странице входа в систему и использовал встроенные методы и свойства AuthComponents, такие как loginRedirect, autoRedirect и allow() .Затем просто включите / выключите captcha на основе переменной Captchas.loginAttempts.
Что касается вашего текущего метода, я не думаю, что вы получите элегантный способ сделать это.Однако вы могли бы изменить свойства AuthComponent, чтобы получить то, что вы хотите.Вы могли бы изменить loginRedirect и loginAction так, чтобы /captchas/index был новой формой входа в систему, затем при успешной captcha установите loginAction обратно в /users/login или что-то еще.Таким образом, если бы кто-то попытался зайти в /users/login напрямую, не вводя captcha, то сработала бы логика AuthComponent и перенаправила бы на /captchas/index.
Вот несколько соответствующих страниц руководства:
- http://book.cakephp.org/view/392/loginRedirect
- http://book.cakephp.org/view/382/allow
- http://book.cakephp.org/view/395/autoRedirect
- http://book.cakephp.org/view/391/loginAction
Надеюсь, это поможет!