Я использую основной компонент Auth. Я создал логин пользователя, который управляет всеми разрешениями. Я реализую мониторинг входа в систему путем проверки $this->Auth->user()
в app_controller. Каждый раз, когда app_controller переключает функции beforeFilter()
и !$this->Auth->user()
, он будет увеличивать переменную сеанса Captcha.LoginAttempts
. Когда Captcha.LoginAttempts
равен> 3, я хочу, чтобы он перенаправлял на контроллер Captchas, отображая экран капчи, требующий от пользователя подтвердить, что он человек. (Аналогично тому, как это делает stackoverflow).
Проблема, с которой я сталкиваюсь, заключается в том, что если я использую элемент где-либо или ссылаюсь на что-то в структуре торта на странице, он попадет на перенаправление и вызовет бесконечный круговой перенаправление для каждого обращающегося элемента / компонента, вызываемого внешним по отношению к фактическому контроллер / действие. Есть ли лучший способ реализовать это?
Вот фактический код, с которым я связывался. Но это в основном отстой (ИМО):
// 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
уже установлена, он будет игнорировать перенаправление. Должен быть более элегантный способ реализовать это. Кто-нибудь?