Как перенаправить на captcha для неудачной попытки x без циклических перенаправлений в CakePHP?

StackOverflow https://stackoverflow.com/questions/3499011

Вопрос

Я использую основной компонент аутентификации.Я создал логин пользователя, который управляет всеми разрешениями.Способ, которым я реализую мониторинг входа в систему, заключается в проверке наличия $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.

Вот несколько соответствующих страниц руководства:

Надеюсь, это поможет!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top