2012-07-16 3 views
10

Il mio obiettivo è avere un sale unico per ogni utente piuttosto che usare semplicemente Configure::read('Security.salt') per ogni utente.CakePHP 2: Sovrascrivi il metodo "password" di AuthComponent

So che CakePHP 2.x non blocca più automaticamente le password. Questo mi consente di eseguire la convalida del modello sulle password, che è molto bella. Tuttavia, non vedo il modo in cui posso ignorare il metodo "password" di AuthComponent. Pertanto, anche se riesco a controllare il modo in cui le password vengono sottoposte all'hash prima di essere salvate nel database, non riesco a controllare il modo in cui le password vengono sottoposte a hash quando si esegue il login effettivo. Dal libro di cucina:

Non c'è bisogno di hash delle password prima di chiamare $this->Auth->login().

Cosa posso fare per rendere $this->Auth->login() utilizzare un metodo personalizzato di hashing della password?

Grazie.

UPDATE: Ho finito per andare con la risposta del dr Hannibal Lecter (creazione di un oggetto di autenticazione personalizzato). Ecco come fare:

vecchio codice:

$this->Auth->authenticate = array('Form' => array('fields' => array('username' => 'email'))); 

Nuovo codice (cambiamento "Form" a "Custom"):

$this->Auth->authenticate = array('Custom' => array('fields' => array('username' => 'email'))); 

Crea "app/Controller/Component/Auth/CustomAuthenticate.php "e farlo sembrare come questo:

<?php 
App::uses('FormAuthenticate', 'Controller/Component/Auth'); 

class CustomAuthenticate extends FormAuthenticate { 
} 

Copiare il "_findUser" e "" metodi da" _password lib/Pasticceria/controller/Com ponent/Auth/BaseAuthenticate.php "e incollarli nella classe" CustomAuthenticate ". Poi fare le seguenti due modifiche al metodo "_findUser":

  1. rimuovere questa riga dalla matrice "condizioni $": $model . '.' . $fields['password'] => $this->_password($password),

  2. Change if (empty($result) || empty($result[$model])) { a if (empty($result) || empty($result[$model]) || $result[$model][$fields['password']] != $this->_password($password, $result[$model]['id'])) {

Poi fare le seguenti due modifiche al metodo "_password":

  1. creare il parametro "$ id" modificando protected function _password($password) { a protected function _password($password, $id) {

  2. Aggiornare il valore sale modificando return Security::hash($password, null, true); a return Security::hash($password, null, Configure::read('Security.salt') . $id);

Infine, aggiornare tutte le occorrenze di AuthComponent::password da utilizzare Security::hash con la stessa logica sopra.

risposta

4

Probabilmente potresti creare un custom auth object e cancellarne la password come preferisci. Dai uno sguardo allo existing auth objects per avere un'idea generale di come funzionano.

+0

Che ha funzionato! Ho aggiornato la mia domanda con il codice pertinente. Grazie! – Nick

1

Avete considerato di non utilizzare la chiamata Auth-> login() ma piuttosto di utilizzare il codice dell'attuale implementazione nel modello? (http://api20.cakephp.org/view_source/auth-component#line-506) Puoi riscriverlo in base alle tue esigenze.

+0

Non sono sicuro di come lo farei e non mi sembra un modo molto amichevole per lo sviluppo. Avere un sale unico per ogni utente non è sicuramente un obiettivo insolito. Hai qualche codice di esempio? Ad ogni modo, apprezzo il tuo tempo – Nick

1

Per chi desidera avere maggiori informazioni sul perché salting di ogni password è il modo giusto per accedere alle password hash (con esempi di codice), visitare qui: http://crackstation.net/hashing-security.htm.

Forse un leggero miglioramento del codice pubblicato qui è di prendere il consiglio dell'articolo appena collegato e di generare un "nuovo sale casuale" ... "ogni volta che un utente crea un account o cambia la password ".

L'implementazione qui inserita utilizza una combinazione del sale statico codificato di Auth originale più l'ID utente come il sale, il che significa che lo stesso sale viene riutilizzato per ogni utente ogni volta che cambiano la password. Quindi, se si desidera seguire i consigli di questa guida all'hashing, è necessario generare un nuovo salt casuale ogni volta che l'utente crea/modifica la propria password e deve memorizzare quel sale univoco nella tabella utenti insieme alla password con hash.

si potrebbe usare il loro generatore casuale di sale:

define("PBKDF2_SALT_BYTES", 24); 
$salt = base64_encode(mcrypt_create_iv(PBKDF2_SALT_BYTES, MCRYPT_DEV_URANDOM)); 

e per convenzione, memorizzarlo nella tabella utenti in un nuovo campo denominato 'sale'. Poiché il codice ti fornisce già l'id utente, puoi sempre archiviare/cercare il sale secondo necessità.

Inoltre, in questo articolo viene menzionata una sezione su "Funzioni di hash lente" utilizzando una tecnica nota come "allungamento della chiave" e come implementare utilizzando algoritmi standard come PBKDF2 o bcrypt. Vengono forniti esempi di codice PHP che possono essere copiati e incollati nell'implementazione Auth personalizzata per una maggiore sicurezza.

CakePHP sviluppatore Mark Story ha pubblicato un blog su come implement bcrypt in CakePHP's Auth

Nella sezione commenti, Mark Story commentato che CakePHP 2.3 avrà alcune nuove funzionalità integrate per generare hash bcrypt.

0

Atleast in cake 2.3 un sale unico è già utilizzato, anche se il sale nel valore di configurazione è sempre lo stesso. Non sono sicuro che questo sia vero anche per le versioni precedenti.

Si potrebbe anche solo modificare il sale nella funzione beforeSave() nel modello User utilizzando Configure :: write ("Security.salt", $ superAwesomeUserSpecificSalt);