Pergunta

Eu tenho um banco de dados existente que eu estou tentando colocar um aplicativo de bolo em cima. A cripta app usados ??velhos () em Perl para as senhas de hash. Eu preciso fazer o mesmo no aplicativo PHP.

Onde é o lugar correto para fazer essa mudança em um aplicativo CakePHP padrão? E o que seria essa mudança parece?

Foi útil?

Solução

Eu tenho que trabalhar ...

aqui é a minha AppController:

class AppController extends Controller {
    var $components = array('Auth');

    function beforeFilter() {
        // this is part of cake that serves up static pages, it should be authorized by default
        $this->Auth->allow('display');
        // tell cake to look on the user model itself for the password hashing function
        $this->Auth->authenticate = ClassRegistry::init('User');
        // tell cake where our credentials are on the User entity
        $this->Auth->fields = array(
           'username' => 'user',
           'password' => 'pass',
        );
        // this is where we want to go after a login... we'll want to make this dynamic at some point
        $this->Auth->loginRedirect = array('controller'=>'users', 'action'=>'index');
    }
}

Então aqui é o usuário:

<?php
class User extends AppModel {
    var $name = 'User';

    // this is used by the auth component to turn the password into its hash before comparing with the DB
    function hashPasswords($data) {
         $data['User']['pass'] = crypt($data['User']['pass'], substr($data['User']['user'], 0, 2));
         return $data;
    }
}
?>

Tudo o resto é normal, eu acho.

Aqui é um recurso bom: http : //teknoid.wordpress.com/2008/10/08/demystifying-auth-features-in-cakephp-12/

Outras dicas

método Na verdade, o acima descrito por DANB não funcionou para mim no CakePHP 2.x Em vez disso, acabou criando um componente de autenticação personalizada para ignorar o algoritmo de hash padrão:

/app/Controller/Component/Auth/CustomFormAuthenticate.php

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

class CustomFormAuthenticate extends FormAuthenticate {

    protected function _password($password) {
        return self::hash($password);
    }

    public static function hash($password) {
        // Manipulate $password, hash, custom hash, whatever
        return $password;
    }
}

... e então usar isso em meu controlador ...

public $components = array(
    'Session',
    'Auth' => array(
        'authenticate' => array(
            'CustomForm' => array(
                'userModel' => 'Admin'
            )
        )
    )
);

Este último bloco pode também ser colocado dentro do beforeFilter método do AppController . No meu caso eu simplesmente optar por colocá-lo especificamente em um controlador de onde eu estava indo para autenticação personalizada uso com um modelo de usuário diferente.

Apenas para acompanhar esta questão no CakePHP 2.4.1, eu estava construindo um front-end para um banco de dados legado que tinha senhas de usuários existentes armazenados como md5 (AccountNumber: StaticText: password), e para permitir que os usuários façam login precisávamos usar esse sistema de hashing também.

A solução foi:

Crie um arquivo app / Controller / Component / Auth / CustomAuthenticate.php com:

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

class CustomAuthenticate extends FormAuthenticate {

    protected function _findUser($username, $password = null) {
        $userModel = $this->settings['userModel'];
        list(, $model) = pluginSplit($userModel);
        $fields = $this->settings['fields'];

        if (is_array($username)) {
            $conditions = $username;
        } else {
            $conditions = array(
                $model . '.' . $fields['username'] => $username
            );

        }

        if (!empty($this->settings['scope'])) {
            $conditions = array_merge($conditions, $this->settings['scope']);

        }

        $result = ClassRegistry::init($userModel)->find('first', array(
            'conditions' => $conditions,
            'recursive' => $this->settings['recursive'],
            'contain' => $this->settings['contain'],
        ));
        if (empty($result[$model])) {
            return false;
        }

        $user = $result[$model];
        if ($password) {
            if (!(md5($username.":statictext:".$password) === $user[$fields['password']])) {
                return false;
            }
            unset($user[$fields['password']]);
        }

        unset($result[$model]);
        return array_merge($user, $result);
    }

}

O "estende FormAuthenticate" significa que este arquivo assume a função _findUser mas adia a FormAuthenticate para todas as outras funções como normal. Este é então ativada editando AppController.php e adicionando à classe AppController algo como isto:

public $components = array(
    'Session',
    'Auth' => array(
        'loginAction' => array('controller' => 'accounts', 'action' => 'login'),
        'loginRedirect' => array('controller' => 'accounts', 'action' => 'index'),
        'logoutRedirect' => array('controller' => 'pages', 'action' => 'display', 'home'),
        'authenticate' => array (
            'Custom' => array(
                'userModel' => 'Account',
                'fields' => array('username' => 'number'),
            )
        ),
    )
);

Em nota particular o uso da chave de matriz associativa 'Custom'.

Finalmente é necessário de hash a senha ao criar um novo usuário, assim o arquivo de modelo (no meu caso Account.php) acrescentei:

public function beforeSave($options = array()) {
    if (isset($this->data[$this->alias]['password'])) {
        $this->data[$this->alias]['password'] = md5($this->data[$this->alias]['number'].":statictext:".$this->data[$this->alias]['password']);
    }
    return true;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top