CakePHP 2,如何用纯文本密码验证AuthComponent :: login()?

时间:2012-08-12 10:51:06

标签: authentication cakephp-2.0

我想在现有数据库上使用纯文本密码字段实现CakePHP 2网站。

这是我的AppController

class AppController extends Controller {
  public $components = array(
    'Session',
    'Auth' => array(
      'loginRedirect' => array('controller' => 'users', 'action' => 'index'),
      'logoutRedirect' => array('controller' => 'users', 'action' => 'home'),
      'authError' => 'You cannot view this page',
      'authorize' => array('Controller'),
      'authenticate' => array(
        'Form' => array(
          'userModel' => 'User',
          'fields' => array('username' => 'user_id', 'password' => 'user_password')
        )
      )
    )
  ); 

  public function isAuthorized($user) {
    return true;
  }

  function beforeFilter() {
    $this->Auth->allow('home');
    //$this->Auth->authenticate = $this->User;

    parent::beforeFilter();
  } 

这是我的UserController。

class UsersController extends AppController {
  public $paginate = array(
    'fields' => array('user_id', 'user_desc', 'user_password'),
    'limit' => 25,
    'order' => array(
      'user_id' => 'asc'
    )
  );

  function login() {
    if ($this->request->is('post')) {
      if ($this->Auth->login()) {
        $this->redirect($this->Auth->redirect());
      } else {
        $this->Session->setFlash('Cannot Login');  
      }
    }
  }
}

这是我的用户模型

class User extends AppModel {
  public $name = 'User';
  public $primaryKey = 'user_id';
  public $belongsTo = 'Group'; 
}

根据上面的那些文件,当我按下login.ctp上的Login按钮时,我看到了

  

从user_password ='this_is_hashing_password'

的用户中选择*

在sql转储部分。

那么,如何关闭自动哈希算法,所以login()会将用户输入与数据库存储密码进行比较为纯文本???

我在CakePHP书上尝试了很多阅读,但是我找不到任何东西,也使用了从互联网上找到的hashPasswords($ data)技术。

请帮忙。 Kongthap。

2 个答案:

答案 0 :(得分:2)

最好的答案确实批量处理您存储的密码以便对它们进行哈希处理,但是在某些情况下,您可能会将Cake应用程序添加到现有应用程序中,这些应用程序会以不同的方式记录密码(例如根本没有对它们进行散列),所以即使这种情况下的目标不是,这个问题也是有效的。

尝试使用这些资源修改Cake的密码散列函数,具体取决于您的Cake版本:

答案 1 :(得分:0)

我在Cakephp 3中使用了纯文本密码,该密码仅用于 DEVELOPMENT 目的,切勿在生产环境中以纯文本格式存储密码。

也就是说,在开发过程中,纯文本密码使我可以专注于登录,而不是实现功能齐全的用户加密/解密逻辑。无论如何,它将被OAuth / SAML模块取代...

好的,下面是源代码:

ROOT / src / Auth / PlainTextPasswordHasher.php

<?php
namespace App\Auth;

use Cake\Auth\AbstractPasswordHasher;
/**
 * Plain text password for demo use, DO NOT PUSTH THIS TO PROD
*/
class PlainTextPasswordHasher extends AbstractPasswordHasher
{

    public function hash($password)
    {
        return $password;
    }

    public function check($password, $hashedPassword)
    {
        return $password === $hashedPassword;
    }
}

ROOT / src / Controller / PagesController.php

<?php
class PagesController extends AppController
{

    public function initialize()
    {
        parent::initialize();

        $this->loadComponent('Auth', [
            'authenticate' => [
                'Form' => [
                    'fields' => [
                        'username' => 'username',
                        'password' => 'password',
                    ],
                    'passwordHasher' => [
                        'className' => 'PlainText',
                    ],
                    'userModel' => 'YourUsers',
                ]
            ],
            'loginAction' => [
                'controller' => 'Logins',
                'action' => 'login'
            ]
        ]);
    }
}

来源:这段视频https://www.youtube.com/watch?v=eASSNS1f3V4和官方文档的这一部分:https://book.cakephp.org/3.0/en/controllers/components/authentication.html#creating-custom-password-hasher-classes