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.