簡體   English   中英

如何在插入數據庫之前按需禁用cakephp3哈希密碼?

[英]How to disable cakephp3 hashing password on demand before insert it to database?

在“我的應用”中,默認情況下,我使用cakephp3的DefaultPasswordHasher創建和修改用戶密碼。 我正在做一個CSV導出/導入用戶模塊,該模塊允許通過DefaultPasswordHasher導入已散列的密碼。

我的CSV中有一些用戶具有純文本密碼,這些密碼將在導入過程中進行哈希處理。 而且用戶已經具有哈希密碼,因此只需將其推送到數據庫即可。

username;displayname;password_type;password;profilename;enabled;admin
user1;User1;plaintext;abcd1234;Default;1;1
user2;User2;hashed;$ueipzueirzouiodjfm$dsklfj;Default;1;1

所以我嘗試了這個:

創建文件./src/Auth/LegacyPasswordHasher.php並將其插入:

<?php
namespace App\Auth;

use Cake\Auth\AbstractPasswordHasher;

class LegacyPasswordHasher extends AbstractPasswordHasher
{
        public function hash($password)
        {
                return $password;
        }
}

?>

在UsersController.php中

public function import()
{
... 
// If hashed is set in CSV line then :
                            $this->loadComponent('Auth', [
                                'authenticate' => [
                                    'Form' => [
                                        'passwordHasher' => ['className' => 'Legacy',]
                                        ]
                                    ]
                                ]);
...
}

我收到一個錯誤消息,即“ Auth”別名已被加載。 是的,它是由父AppController.php實現的。 我要避免在每個Users方法上加載Auth Component。

有沒有一種方法可以僅對字段“ password”禁用按需散列?

我自己找到了解決方案。

發布問題后,我嘗試了完全錯誤的解決方案。 正確的問題是:在將密碼插入數據庫之前,是否有辦法按需禁用哈希密碼?

我不知道這是否是最好的解決方案。

由於哈希是由Model完成的,因此我創建了一個新模型,該模型指向與Users Model相同的表。

src / Model / Table / NoHashPasswordUsersTable.php:

class NoHashPasswordUsersTable extends Table
{
   public function initialize(array $config) {
      // Set table to use
      $this->table('users');
      // or After Cakephp 3.4.0
      //$this->setTable('users');
      ...
   }
    public function validationDefault(Validator $validator)
    {
        ...
        // Validation rules to check length of hashed string
        $validator
            ->add('password', 'notEmpty', [
                'rule' => ['lengthBetween', 60, 60],
                'message' => __('Hashed password should contains 60 chars')
            ]);

        return $validator;
    }
}

創建一個沒有功能_setPassword的實體文件src / Model / Entiry / NoHashPasswordUser.php

在src / Controller / UsersController.php中:

// Load model that allow to import Users without hashing the password
$this->loadModel('NoHashPasswordUsers');
...
// I can switch Model to use to hash or not hash the password, for example 
$this->Users->save($user)
$this->NoHashPasswordUsers->save($user)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM