【问题标题】:How to validate request with hashed value for exist on table column?如何验证表列上存在哈希值的请求?
【发布时间】:2018-12-12 11:57:23
【问题描述】:

我已经在我的表中散列了用户名。我如何将这种验证方法用于散列值:

'name' => 'required|unique:users'

用户名示例请求:John

表上现有用户名示例:RndqMUU5ZUJnQ2JhWjZvNUh5ZGp2UT09

我认为首先我必须对请求中的输入值进行哈希处理,然后验证是否正确?我可以在哪里散列和验证这些值?

【问题讨论】:

  • 最初是如何对名称进行哈希处理的?
  • 约翰@OluwatobiSamuelOmisakin
  • 我的意思是你是如何散列'John'这个名字的。你用了什么方法或哈希函数?
  • 我有自己的 encrypt/decrypt 数据散列方法 @OluwatobiSamuelOmisakin
  • 你能展示一下加密函数的sn-p吗?

标签: laravel validation laravel-5.6


【解决方案1】:

你可以使用Hash facadecheck方法,来自docs

use Illuminate\Support\Facades\Hash;

// some code

if (Hash::check('plain-text', $hashedElement)) {
    // The elements match...
}

现在,您可以在 Custom Validation Rule 中使用它:

1。创建规则类

php artisan make:rule HashedNameCheck

2。自定义类

app\Rules\HashedNameCheck.php

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;
use Illuminate\Support\Facades\Hash; // <-- notice.

class HashedNameCheck implements Rule
{
    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        // here you get the hashed name stored in your database (?)
        $hashedName = App\User::find(1)->name;

        // next, you compare this with the received value.
        return Hash::check($value, $hashedName);
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return 'The :attribute does not match with the stored value.';
    }
}

3。应用规则。

在你的控制器中使用它:

$request->validate([
    // some other validation rules..
    'name' => ['required', 'unique:users', new HashedNameCheck],
]);

或在您的自定义 Form Request 类中:

public function rules()
{
    return [
        // some other validation rules..
        'name' => ['required','unique:users', new HashedNameCheck],
    ];
}

【讨论】:

  • 你的规则字符串/数组好像坏了
  • @HCK 如果我想使用其他规则验证同一个字段,那么我总是需要为多个文件创建多个规则?
  • @Otabek 如果这些规则是自定义的并且您希望它们可重用,是的。虽然如果您知道所有这些规则都将在这种情况下应用,您可以将所有这些规则包含在一个文件中(注意 passed 方法返回一个布尔值,因此只需在该方法中实现您的逻辑并返回结果您的验证)。
  • 您能否举例说明如何将我自己的所有其他规则写入一个文件并使用它? @HCK
  • 例如,在我的数据库中,每个值都使用我自己的方法进行哈希处理,如果我想要重新哈希并检查是否存在我必须为每个字段单个 rul 文件创建的值? @HCK
【解决方案2】:

您可以将闭包传递给验证,然后您可以检查散列值。

$validator = Validator::make($request->all(), [
    'name' => [
        'required',
        'max:255',
        function($attribute, $value, $fail) {
            if (Hash::check($attribute) === $value) {
                return $fail($attribute.' is invalid.');
            }
        },
    ],
]);

【讨论】:

    【解决方案3】:

    据我所知,没有内置的验证规则首先对值进行哈希处理。

    您始终可以编写自定义规则:

    $rules = [
       'name' => [ 
            'required', 
            function($attribute, $value, $fail) {
                if (User::find(Hash::make($value))) {
                   return $fail('The username already exists');
                }
            },
    ];
    

    如果您经常使用此规则,您也可以将它移到外面,例如您可以将其添加到您的服务提供商中:

     public function boot() {
        Validator::extend('uniqueHashedUser', function ($attribute, $value, $parameters, $validator) {
            if (User::find(Hash::make($value))) {
               return false;
            }
           return true;
        });
     }
    

    那么你可以把它当作:

     $rules = [ "name" => 'required|uniqueHashedUser' ]; 
    

    【讨论】:

    • 我如何首先在示例form requestrules() 方法中使用您的代码? @apokryfos
    • 创建该数组,然后在规则函数中创建return $rules;
    • 查看my form request 并告诉我我哪里有错误? @apokryfos
    【解决方案4】:

    大家好,在设置存储驱动程序时需要考虑一些事情

    1. 本地存储不是公共的,尽管您可以通过符号链接来访问它,但不建议将其用于头像等公共项目
    2. 公共驱动程序:最适合公共项目

    请注意,这很重要: 您在 env 中的 APP_URL 必须设置为您正在使用的 url,因此如果您有类似 mysite.test 的内容,则必须将其作为您的 APP_URL

    希望对大家有所帮助

    【讨论】:

      猜你喜欢
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-08
      • 2012-11-12
      • 2012-08-21
      • 2014-09-13
      • 1970-01-01
      相关资源
      最近更新 更多