Perché il componente di autenticazione CakePHP non contiene la mia password?
-
03-07-2019 - |
Domanda
Sto usando CakePHP 1.2 con componenti Auth e ACL.
Nell'azione del mio registro utenti, la password non viene visualizzata. In particolare, questa espressione:
if ($this->data['User']['password'] !=
$this->Auth->password($this->data['User']['confirm_password']))
Questo sta valutando su true, anche quando invio valori identici per password
e confirm_password
. So che la password non è cancellata perché quando rimuovo la chiamata a Auth- > password
, l'espressione diventa falsa.
Mi aspettavo che il modulo Auth eseguisse automaticamente l'hashing della password. Cosa sto sbagliando?
Ecco il mio punto di vista:
<?php
echo $form->create('User', array('action' => 'register'));
echo $form->input('email',
array('after' => $form->error(
'email_unique', 'This email is already registered.')));
echo $form->input('password');
echo $form->input('confirm_password', array('type' => 'password'));
echo $form->end('Register');
?>
Ecco la mia azione di registrazione dal controller utente:
function register(){
if ($this->data) {
if ($this->data['User']['password'] !=
$this->Auth->password($this->data['User']['confirm_password'])) {
$this->Session->setFlash(__('Password and Confirm Password must match.', true));
$this->data['User']['password'] = '';
$this->data['User']['confirm_password'] = '';
}
else{
$this->User->create();
if ($this->User->save($this->data)){
$this->redirect(array('action' => 'index'), null, true);
}
else {
$this->data['User']['password'] = '';
$this->data['User']['confirm_password'] = '';
$this->Session->setFlash(__('Some problem saving your information.', true));
}
}
}
}
Ed ecco il mio appController
dove includo i moduli Auth
e Acl
:
class AppController extends Controller {
var $components = array('Acl', 'Auth');
function beforeFilter(){
if (isset($this->Auth)) {
$this->Auth->allow('display');
$this->Auth->fields =
array(
'username' => 'email',
'password' => 'password');
$this->Auth->authorize = 'actions';
}
}
}
Cosa sto sbagliando?
Soluzione
CakePHP non hash le password a meno che il nome utente non contenga un valore inviato. Sto sostituendo il campo nome utente con e-mail. Tuttavia, ho rimappato quei campi impostando la matrice dei campi Auth- > ;. Tuttavia, lo stavo facendo in appController anziché in userController. Quindi spostando questa linea:
$this->Auth->fields = array('username' => 'email', 'password' => 'password');
da appController a userController risolto.
Ora la domanda diventa " Perché non posso ripristinare i campi Auth- > in appController? & Quot;
Altri suggerimenti
Probabilmente stai sovrascrivendo AppController :: beforeFilter ()
con il tuo UsersController :: beforeFilter ()
.
Per " correggere " basta inserire parent :: beforeFilter ()
all'inizio della funzione.
È necessario hash password prima di salvare nel database. Inserisci questa funzione nel tuo modello utente:
function beforeSave() {
if(isset($this->data[$this->alias]['password']))
$this->data[$this->alias]['password'] = Security::hash($this->data[$this->alias]['password'], null, true);
return true;
}
E non dimenticare di metterlo in beforeFilter ()
al controller degli utenti:
if(in_array($this->action, array('register'))) {
$this->Auth->fields = array('username' => 'email', 'password' => 'wrongfield');
}
Ciò significa che la password NON verrà cancellata durante il processo di registrazione (in caso di mancata convalida del modulo di registrazione).
Penso che tu stia cercando
hashPasswords ($data)
guarda queste pagine. Dovrebbero indicarti la giusta direzione. Puoi anche provare a cambiare il tuo livello di debug nel file di configurazione principale. cambiandolo da 0 (produzione) a 3 ti permette di vedere l'output sql. può essere utile.
Risoluzione dei problemi di Cakephp
Mi dispiace non poter fare altro che indicarti la giusta direzione. Sono nuovo di cakephp.