Как перенаправить на капчу для х не удалось без круговых перенаправлений в CakePHP? - PullRequest
0 голосов
/ 17 августа 2010

Я использую основной компонент 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 уже установлена, он будет игнорировать перенаправление. Должен быть более элегантный способ реализовать это. Кто-нибудь?

1 Ответ

1 голос
/ 17 августа 2010

Обычно, я бы просто попытался ответить так, как вы пытаетесь это сделать, но так как вы спрашивали о каких-либо более хороших идеях, я хотел бы, чтобы на самом деле на странице входа была установлена ​​капча и использовались встроенные методы и свойства AuthComponents как loginRedirect, autoRedirect и allow (). Затем просто включите / выключите капчу на основе переменной Captchas.loginAttempts.

Что касается вашего текущего метода, я не думаю, что вы получите элегантный способ сделать это. Тем не менее, вы можете изменить свойства AuthComponent, чтобы получить то, что вы хотите. Вы можете изменить loginRedirect и loginAction так, чтобы / captchas / index была новой формой входа в систему, затем при успешной проверке установите loginAction обратно на / users / login или что-то еще. Таким образом, если кто-то попытается нажать / users / login напрямую, не используя капчу, тогда логика AuthComponent включится и перенаправит на /captchas/index.

Вот некоторые соответствующие справочные страницы:

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

...