2

我想用纯文本密码字段在现有数据库上实现 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();
  } 

这是我的用户控制器。

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 上的登录按钮时,我看到

select * from users where user_password = 'this_is_hashing_password'

在 sql 转储部分。

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

我在 CakePHP 书上尝试了很多阅读,但我找不到任何内容,而且使用从互联网上找到的 hashPasswords($data) 技术也不起作用。

请帮忙。孔塔。

4

2 回答 2

2

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

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

于 2012-11-06T18:26:41.580 回答
0

我得到了纯文本密码Cakephp 3,这应该只用于开发目的,你不应该在生产中以纯文本形式存储密码。

话虽如此,在开发过程中,纯文本密码让我可以专注于登录,而不是实现功能齐全的用户加密/解密逻辑。无论如何,这将被 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

于 2018-12-24T03:05:49.883 回答