修改Auth默认加密方式

edited 十月 2013 in CakePHP
Auth默认的加密方式比较复杂。

大概的步骤为:

1. $password = Configure::read('Security.salt') . $password;

如果当前PHP环境里sha1函数存在,则

1. $password = sha1($password);

如果当前PHP环境里mhash函数存在,则

1. $password = bin2hex(mhash(MHASH_SHA256, $password));

如果当前PHP环境里hash函数存在,则

1. $password = hash('sha256', $string);

最后,逼不得已,才使用

1. $password = md5($string);

那么可不可以更改Auth默认的加密方式。答案是肯定的,CakePHP还是比较人性化的,呵呵!

通过下面的方法,我们可以把Auth默认加密方式改成md5。当然看个人所需,你可以随便修改。

方法一:

修改

1. $this->Auth->authenticate = new XXXXXClass();

看清楚是authenticate而不是authorize

在这个XXXXXClass里写个hashPasswords()方法,如:

1. class XXXXXClass {
2.
3. var $userModel = 'User';
4.
5. var $fields = array(
6.
7. 'username' => 'username',
8.
9. 'password' => 'password',
10.
11. );
12.
13. function hashPasswords($data){
14.
15. if (is_array($data) && isset($data[$this->userModel])) {
16. if (isset($data[$this->userModel][$this->fields]) && isset($data[$this->userModel][$this->fields])) {
17. $data[$this->userModel][$this->fields] = $this->password($data[$this->userModel][$this->fields]);
18. }
19. }
20. return $data;
21.
22. }
23.
24. function password($password){
25.
26. return md5($password);//我们采用md5方式
27.
28. }
29.
30. }

这样子,我们就已经把Auth加密方式改成了md5了(以上代码形式其实就来自Auth,我懒的动,你或许可以写的更好一些,呵呵)。通常我们不需要另外再建立个Class文件,因为Auth默认需要一个UserModel来做登陆的。上面可以改成

1. $this->Auth->authenticate = $this->Auth->getModel();

然后,我们就可以把上面Class文件里的代码移到User Model里了。

方法二:

Auth加密方式,采用的是Security::hash($string, $type = null, $salt = false)静态方法。其代码如下:

1. function password($password) {
2. return Security::hash($password, null, true);
3. }

再看看Security::hash方法

1. function hash($string, $type = null, $salt = false) {
2. $_this =& Security::getInstance();
3.
4. if ($salt) {
5. if (is_string($salt)) {
6. $string = $salt . $string;
7. } else {
8. $string = Configure::read('Security.salt') . $string;
9. }
10. }
11.
12. if (empty($type)) {
13. $type = $_this->hashType;
14. }
15. $type = strtolower($type);
16.
17. if ($type == 'sha1' || $type == null) {
18. if (function_exists('sha1')) {
19. $return = sha1($string);
20. return $return;
21. }
22. $type = 'sha256';
23. }
24.
25. if ($type == 'sha256' && function_exists('mhash')) {
26. return bin2hex(mhash(MHASH_SHA256, $string));
27. }
28.
29. if (function_exists('hash')) {
30. return hash($type, $string);
31. }
32. return md5($string);
33. }

我们看到Auth调用时,参数$type为null。那么就可以修改Security的hashType属性,如:

1. Security::setHash('md5');

强制改变其加密方式了。但是这里有个不称心的地方就是无论你修改为何种加密方式,其密码总是以

1. $password = Configure::read('Security.salt') . $password;

为基础的。

方法三:

修改Auth组件,有一次在一个群,总是听一个家伙在嚷嚷,其大意是"CakePHP哪里哪里有BUG,我要修改它的源代码"。你确信 CakePHP的代码有BUG,你确信你写的代码没有BUG,并且能兼容整个CakePHP环境,你不再去更新它的升级版了,那么你改吧,呵呵!

OOP的好处之一就是可以继承并修改。言归正传,那么我们如何修改Auth呢。简单,自己再写个Component,继承AuthComponent

1. <?php
2. App::import('Component', 'Auth');
3.
4. class MyAuthComponent extends AuthComponent {
5. /**
6. * 更改Auth用户密码加密方式为md5
7. * @return string md5($password)
8. */
9. function password($password) {
10. return md5($password);
11. }
12. }

以后,我们就可以直接用MyAuth组件来替换Auth了。当然了,你可以在里面做更多的事。

方法四:

你来想吧……^_^
更多信息:http://www.71151461.cn/

原始討論: http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=3803
Sign In or Register to comment.