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?

Foi útil?

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.

AuthComponent-Métodos

Cakephp solução de problemas

Desculpe eu não posso fazer nada, mas apontá-lo na direção certa. Eu sou novo para CakePHP.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top