Domanda

Sto usando il componente principale Auth. Ho creato un account di accesso utente che gestisce tutte le autorizzazioni. Il modo in cui sono l'attuazione del monitoraggio di login è controllando per $this->Auth->user() nel app_controller. Ogni volta che i cicli app_controller la funzione beforeFilter() e !$this->Auth->user(), si incrementa la variabile di sessione Captcha.LoginAttempts. Quando Captcha.LoginAttempts è> 3, lo voglio per reindirizzare al controller CAPTCHA, la visualizzazione di una schermata captcha che richiede all'utente di confermare che sono un essere umano. (Simile a come StackOverflow lo fa).

Il problema che sto avendo è se sto usando un qualche elemento o fare riferimento a qualcosa nel quadro torta sulla pagina, sarà colpito il reindirizzamento e causare un reindirizzamento circolare senza fine per ogni accesso elemento / benessere componente chiamato esterno al reale regolatore / azione. C'è un modo migliore per implementare questo?

Ecco il codice vero e proprio sono stato scherzi con. Ma fa schifo in fondo (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'));
                }
            }
        }

È possibile vedere come cerco di evitare il riferimento circolare. Ma allora l'utente potrebbe semplicemente andare alla pagina di login e dato che la variabile di sessione Captcha.fail è già impostato, ignorerà il redirect. Ci deve essere un modo più elegante per implementare questa. Chiunque?

È stato utile?

Soluzione

Normalmente, vorrei solo cercare di rispondere il modo in cui si sta cercando di farlo, ma dal momento che lei ha chiesto per tutte le idee migliori, quello che vorrei fare è avere il Captcha realtà nella pagina di accesso e utilizzare i AuthComponents incorporato metodi e proprietà come loginRedirect, autoRedirect, e consentire (). Poi, basta girare il captcha on / off in base alla variabile Captchas.loginAttempts.

Per il vostro metodo corrente, non credo che si sta andando ad ottenere un modo elegante di fare questo. Tuttavia, si potrebbe essere in grado di modificare le proprietà del AuthComponent per ottenere quello che vuoi. Si potrebbe cambiare loginRedirect e loginAction in modo che / captcha / index è il nuovo modulo di login, quindi il captcha di successo, insieme loginAction torna a / utenti / login o qualsiasi altra cosa. In questo modo, se qualcuno dovesse tentare di hit / utenti / login direttamente senza fare il captcha, quindi la logica AuthComponent sarebbe calci e reindirizzamento a / captcha / index.

Ecco alcune pagine di manuale rilevanti:

Spero che questo aiuti!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top