2014-01-10 46 views
0

我在CakePHP 2.4中遇到了一些麻烦。我烘烤了一个简单的应用程序来创建登录。我做了本书中的所有内容(Auth和Tutorial)。但只有sha1有效。但不是sha256或md5。在搜索和测试之后,我来到了一个解决方案,我必须更改书中的示例代码,现在它可以工作。但我认为,这不是合适的解决方案。仅在sha1中使用CakePHP 2.4进行身份验证?

我的确在AppController中的以下内容:

App::uses('Controller', 'Controller'); 
    class AppController extends Controller { 
    public $components = array(
     'Session', 
     'Auth' => array(
      'authenticate' => array(
       'Form' => array(
        'passwordHasher' => array(
         'className' => 'Simple', 
         'hashType' => 'sha256' 
        ) 
       ) 
      ) 
     ) 
    ); 
} 

我有MD5,SHA1和SHA256测试这一点。没问题。如果密码被适当地散列,登录就可以工作。

但我注意到,添加一个用户只适用于sha1,因为这是默认的散列。 我的用户模型beforeSafe功能是这样的(从书):

App::uses('SimplePasswordHasher', 'Controller/Component/Auth'); 
class User extends AppModel { 
    public function beforeSave($options = array()) { 
    if (isset($this->data[$this->alias]['password'])) { 
     $passwordHasher = new SimplePasswordHasher(); 
      $this->data[$this->alias]['password'] = $passwordHasher->hash(
       $this->data[$this->alias]['password'] 
     ); 
    } 
    return true; 
    } 
} 

我想,这在AppController中设置就足够了,改变SimplePasswordHasher在这方面了。但就目前来看,这还不够。所以我改成了这样:

$this->data[$this->alias]['password'] = $passwordHasher->hash(
    $this->data[$this->alias]['password'] 
); 

这个

$this->data[$this->alias]['password'] = Security::hash(
    $this->data[$this->alias]['password'], 
'sha256', 
true 
); 

现在一切就像一个魅力。但我的问题:

1)我是对的,这是必要的,或者是我的代码有其他错误?

2)据我所知$xxx->zzz只适用于控制器和xxx::zzz()为无处不在,对吗?

3)为什么我必须说安全哈希,它应该再次用sha256散列字符串,当我说已经在AppController中一般?

回答

0

1.据我所知,您的方法是正确的。可能存在一个更清洁的方式,但我使用bcrypt,而食谱说做一些非常相似的事情。

2.你可以像你说的那样想一个简单的解释。基本上->object-operator,用于处理物体例如$this->doEverything。而::scope-resolution-operator,它用于查找Class静态属性或方法。通常你可以在任何地方运行,例如Security::hash()

看看here,你应该改变你的AppController到:

'passwordHasher' => array(
       'className' => 'Simple', 
       'hashType' => 'sha256' 
      ) 

,以适应在recomendations。尽管我已经尝试过了,并没有将SimplePasswordHasher更改为SHA256。这是蛋糕似乎无视某种方式的参考。但这是简单的哈希,旨在简单的事情,所以你应该做你自己的方法,或一个更适合你的需求。