Cómo redirigir al código de imagen para x failed intentó sin redirecciones circulares en CakePHP?

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

Pregunta

Estoy utilizando el componente básico de autenticación. He creado un inicio de sesión de usuario que gestiona todos los permisos. La manera en que yo estoy poniendo en práctica el control de acceso es mediante la comprobación de $this->Auth->user() en el app_controller. Cada vez que los ciclos app_controller la función beforeFilter() y !$this->Auth->user(), se incrementará la variable de sesión Captcha.LoginAttempts. Cuando Captcha.LoginAttempts es> 3, quiero que se redirija al controlador captchas, mostrando una pantalla de código de imagen que el usuario tenga que confirmar que son un ser humano. (Similar a como lo hace stackoverflow).

El problema que estoy teniendo es si estoy usando un algún lugar elemento o hacer referencia a algo dentro del marco de la torta en la página, se golpeó la redirección y causa una redirección circular sin fin para cada elemento / bienestar componente acceder llamada externa a la actual controlador / acción. ¿Hay una mejor manera de implementar esto?

Este es el código real que he estado jugando con. Pero básicamente chupa (OMI):

// 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'));
                }
            }
        }

Se puede ver cómo intento de evitar la referencia circular. Pero entonces el usuario puede ir a la página de inicio de sesión y dado que la variable de sesión Captcha.fail ya está establecido, se ignorará la redirección. Tiene que haber una forma más elegante para implementar esto. Cualquier persona?

¿Fue útil?

Solución

Normalmente, sólo quiero tratar de responder a la forma en que están tratando de hacerlo, pero ya que preguntas por alguna idea mejor, lo que haría es tener el Captcha en realidad en la página de registro y utilizar los AuthComponents incorporado métodos y propiedades como loginRedirect, autoRedirect, y permitir (). Entonces, sólo se conecta el captcha de encendido / apagado basado en la variable Captchas.loginAttempts.

Para su método actual, no creo que va a conseguir una manera elegante de hacer esto. Sin embargo, es posible que pueda cambiar las propiedades de la AuthComponent para conseguir lo que desea. Se podría cambiar loginRedirect y loginAction modo que / captchas / índice es la nueva forma de la conexión, entonces el código de imagen exitosa, un retroceso a loginAction / usuarios / login o lo que sea. De esta manera, si alguien fuera a tratar de golpe / usuarios / login directamente sin hacer el código de imagen, entonces la lógica AuthComponent se sacudía y redirección a / captchas / index.

Estas son algunas páginas de manual relevantes:

Espero que esto ayude!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top