我在表中散列了用户名。如何将这种验证方法用于哈希值:
'name' => 'required|unique:users'
用户名为 John
的示例请求表上的现有用户名示例: RndqMUU5ZUJnQ2JhWjZvNUh5ZGp2UT09
我认为首先我必须对请求中的输入值进行哈希处理,然后在验证之后对吗?在哪里可以哈希和验证此值?
答案 0 :(得分:6)
您可以使用Hash facade中的docs的check
方法:
use Illuminate\Support\Facades\Hash; // some code if (Hash::check('plain-text', $hashedElement)) { // The elements match... }
现在,您可以在Custom Validation Rule中使用它了:
php artisan make:rule HashedNameCheck
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.';
}
}
在您的控制器中使用它:
$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)
大家好,在设置存储驱动程序时要考虑的事项
请注意,这很重要: 您必须将env中的APP_URL设置为您正在使用的url,因此,如果您具有mysite.test之类的内容,则必须将其作为APP_URL
希望对所有人有帮助