CakePHP 2: Zastąp metodę „hasła” AuthComponent

Moim celem jest posiadanie unikalnej soli dla każdego użytkownika, a nie tylko używanieConfigure::read('Security.salt') dla każdego użytkownika.

Wiem, że CakePHP 2.x nie miesza automatycznie haseł. Pozwala mi to na sprawdzenie poprawności modelu dla haseł, co jest bardzo miłe. Nie widzę jednak sposobu, w jaki mogę przesłonić metodę „hasła” AuthComponent. Mimo że mogę kontrolować sposób haszowania haseł przed ich zapisaniem w bazie danych, nie mogę kontrolować sposobu haszowania haseł podczas rzeczywistego logowania. Z książki kucharskiej:

Nie musisz mieszać haseł przed wywołaniem$this->Auth->login().

Co mogę zrobić, aby to zrobić$this->Auth->login() użyć niestandardowej metody mieszania haseł?

Dzięki.

AKTUALIZACJA: Skończyłem z odpowiedzią dr Hannibala Lectera (tworząc własny obiekt uwierzytelniania). Oto jak to zrobić:

Stary kod:

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

Nowy kod (zmień „Formularz” na „Niestandardowy”):

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

Utwórz „app / Controller / Component / Auth / CustomAuthenticate.php” i spraw, aby wyglądał tak:

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

class CustomAuthenticate extends FormAuthenticate {
}

Skopiuj metody „_findUser” i „_password” z „lib / Cake / Controller / Component / Auth / BaseAuthenticate.php” i wklej je do klasy „CustomAuthenticate”. Następnie wykonaj dwie następujące modyfikacje metody „_findUser”:

Usuń ten wiersz z tablicy „$ conditions”:$model . '.' . $fields['password'] => $this->_password($password),

Zmianaif (empty($result) || empty($result[$model])) { doif (empty($result) || empty($result[$model]) || $result[$model][$fields['password']] != $this->_password($password, $result[$model]['id'])) {

Następnie wykonaj dwie następujące modyfikacje metody „_password”:

Utwórz parametr „$ id”, zmieniającprotected function _password($password) { doprotected function _password($password, $id) {

Zaktualizuj wartość soli, zmieniającreturn Security::hash($password, null, true); doreturn Security::hash($password, null, Configure::read('Security.salt') . $id);

Na koniec zaktualizuj wszystkie wystąpieniaAuthComponent::password używaćSecurity::hash z taką samą logiką jak powyżej.

questionAnswers(4)

yourAnswerToTheQuestion