Por que o componente de autenticação CakePHP não hash minha senha?
-
03-07-2019 - |
Pergunta
Eu estou usando CakePHP 1.2 com componentes Auth e ACL.
Na minha acção registo de usuário, a senha está chegando unhashed. Especificamente, esta expressão:
if ($this->data['User']['password'] !=
$this->Auth->password($this->data['User']['confirm_password']))
Esta é avaliar a verdade, mesmo quando eu enviar valores idênticos para password
e confirm_password
. Eu sei que senha é unhashed porque quando eu remover a chamada para Auth->password
, as avalia expressão a falsa.
Eu esperava que o módulo de autenticação de hash de automagicamente a senha. O que estou fazendo de errado?
Aqui é o meu ponto de 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');
?>
Aqui está a minha ação registo do controlador de usuário:
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));
}
}
}
}
E aqui está a minha appController
onde eu incluem os módulos 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';
}
}
}
O que estou fazendo de errado?
Solução
CakePHP não vai de hash de senhas, a menos que nome de usuário contém um valor submetido. Estou substituindo o campo de nome de usuário com e-mail. No entanto, eu remapeado esses campos, definindo o Auth-> array campos. No entanto, eu estava fazendo isso no AppController vez de UserController. Então, movendo-se esta linha:
$this->Auth->fields = array('username' => 'email', 'password' => 'password');
fora do AppController em UserController resolveu.
Agora, a questão torna-se "Por que não pode redefinir a Auth-> campos em AppController?"
Outras dicas
Você provavelmente substituindo AppController::beforeFilter()
com o seu UsersController::beforeFilter()
.
Para "corrigir" isto, basta colocar parent::beforeFilter()
no início da função.
Você deve hash de senha antes de salvar a base de dados. Coloque esta função em seu modelo de usuário:
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 não se esqueça de colocar isso em beforeFilter()
ao seu controlador usuários:
if(in_array($this->action, array('register'))) {
$this->Auth->fields = array('username' => 'email', 'password' => 'wrongfield');
}
Isso significa que a senha não será hash durante o processo de registo (em caso de falha na validação de formulário de registro).
eu acho que você está procurando
hashPasswords ($data)
olhada nessas páginas. Eles devem apontar na direção certa. Você também pode tentar mudar o seu nível de depuração no arquivo de configuração do núcleo. transformando-o de 0 (produção) para 3 permite que você veja você saída sql. pode ser útil.
Desculpe eu não posso fazer nada, mas apontá-lo na direção certa. Eu sou novo para CakePHP.