如何使用表列上存在的哈希值验证请求?

时间:2018-07-04 06:17:47

标签: laravel validation laravel-5.6

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

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

用户名为 John

的示例请求

表上的现有用户名示例: RndqMUU5ZUJnQ2JhWjZvNUh5ZGp2UT09

我认为首先我必须对请求中的输入值进行哈希处理,然后在验证之后对吗?在哪里可以哈希和验证此值?

4 个答案:

答案 0 :(得分:6)

您可以使用Hash facade中的docscheck方法:

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],
    ];
}

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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

$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' ]; 

答案 3 :(得分:0)

大家好,在设置存储驱动程序时要考虑的事项

  1. 您可以通过符号链接来访问本地存储,而不是公共存储,建议对化身等公共物品进行访问
  2. 公共司机:最适合公共物品

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

希望对所有人有帮助