Laravel中如何实现自定义验证,方法是什么
Admin 2022-07-09 群英技术资讯 994 次浏览
在实际应用中,我们有时候会遇到“Laravel中如何实现自定义验证,方法是什么”这样的问题,我们该怎样来处理呢?下文给大家介绍了解决方法,希望这篇“Laravel中如何实现自定义验证,方法是什么”文章能帮助大家解决问题。本文实例讲述了Laravel框架自定义验证过程。分享给大家供大家参考,具体如下:
首先,你需要明白一点,当你开启auth中间件的时候,其实是调用了在app/Http/Kernel.php中的
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
但是这里先不用去纠结这个文件,这里直接看开启这个验证之后会怎样。首先,如果你去访问开启这个验证的控制器,但是你又没有登录的话,那么会默认去搜索login路由,所以你需要在路由中设置该路由:
Route::get('login','AnyControllerName@AnyFunctionName')->name('login');
而且虽然name('login')可设可不设,但是最好加上。接着页面就会跳转到你设置的供用户填写表单的页面,该表单的提交路由你也一样要设置好:
Route::post('login','AnyControllerName@AnyFunctionName');
其实由于这里已经由我们可控了,即,我们可以手动确定表单提交到哪个控制器以及对应该控制器下的方法,所以接下来的问题就是如何使Laravel知道我们确定该用户已经通过了验证了。
这个时候可以使用Auth::attempt()函数,这个函数的作用原理是将你传递进去的数组,比如下面:
public function checkLogin(Request $request){
$user_name=$request->user_name;
$user_id=$request->user_id;
$password=$request->password;
Auth::attempt([
'user_name'=>$user_name,
'user_id'=>$user_id,
'password'=>$password
]);
}
下面是重点!!!
其中,我们使用了3个参数$user_name,$user_id,$password,attempt会把除了$password之外的内容作为$where的内容,从数据库中搜索记录,如果记录为0,那么当然不用说了,验证失败,但是存在该记录时,就需要去匹配$password是否正确。
laravel保存$password的方式是使用PHP的函数password_hash,该函数能计算传入值的哈希值,而且该函数需要第二个参数,指定哈希处理的方式,Laravel中该参数名为PASSWORD_BCRYPT,Laravel会将密码经过该函数处理后再保存。(至于如何做到的,暂时没有机会深究。)
假设你的密码为123456,那么你保存在数据库中的值就是
password_hash('123456','PASSWORD_BCRYPT')
Auth::attempt()会将你提交过来的值,做password_hash($post_password,'PASSWORD_BCRYPT')处理,然后跟数据库中的存储值进行比较,相等则验证通过,不相等,则自然验证失败。
验证通过后,使用Auth::login(Auth::user());就可以完成用户的登录验证了。
这里再穿插一个知识点,当你使用Eloquent作为数据库驱动时,你需要新建一个用户类,User.php,你可以使用命令行来新建该模型,也可以直接手动新建,但是注意,命令行新建的该模型是存在问题的,Auth::attempt()中会去尝试调用该模型,但是其中调用的类类型不是Model!!!所以你自以为新建好了User.php后,发现会报以下错误:
Argument 1 passed to
Illuminate\Auth\EloquentUserProvider::validateCredentials()
must be an instance of
Illuminate\Contracts\Auth\Authenticatable,
instance of
App\User
given, called in /var/www/sample/vendor/laravel/framework/src/Illuminate/Auth/SessionGuard.php on line 379 and defined
简单来说就是你传递的参数错误了,以下是错误演示:
namespace App\Model;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
}
你只要把User.php模型修改成下面的形式就对了:
<?php
namespace App;
use Illuminate\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;
use Illuminate\Database\Eloquent\SoftDeletes;
class User extends Model implements AuthenticatableContract
{
use Authenticatable, CanResetPassword;
// 这个参数是关于软删除的,如果你有软删除需要,那么你可以加上
// use SoftDeletes;
}
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
在thinkphp中,count方法是一个统计查询方法,用于统计数据表或者数据记录数,返回的结果就是统计的字符数,语法为“$model -> [where() -> ] count();”。
php的多进程处理依赖于pcntl扩展,通过pcntl_fork创建子进程来进行并行处理。 例1如下:<?php$pid=pcntl_fork();if($pid==-1){//错误处理:创建子进程失败时返回-1.die('forkerror');}elseif($pid){//父进程会得到子进程号,所以这里是父进程执行的逻
ThinkPHP5.1 已经出现很久了,最近有所接触,下面介绍一下常用的第三方验证码功能的使用,有不少朋友对此感兴趣,下面小编给大家整理和分享了相关知识和资料,易于大家学习和理解,有需要的朋友可以借鉴参考
杀掉swoole进程的方法:首先在代码里将守护进程改成0;然后输入命令“netstat -apn|grep 端口号”,端口号填写swoole程序使用的端口号;最后使用“kill -9 swoole进程的pid”命令即可。
在本篇文章里小编给大家整理的是一篇关于php双向队列如何理解的相关内容及实例,需要的朋友们可以跟着学习下。
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008