被这个鬼玩意整了一个下午了,真的是那句我有句妈卖批一定要说!!!现在来这里整理一下。
首先是两个知识点!
- 中间件
- 授权
这两个玩意有什么用呢?中间件就像是门卫,当你通过路由访问一个类时,如果在这个类内置设置有中间件,则你必须要先去访问那个中间件。就像情侣准备结婚一样,如果女方说你必须先见见她家长,那么你就一定要去见见她家长。女方是你希望访问的最终控制器与方法,而中间件就是她的家长。至于她的家长希望你和她的关系如何,那就看具体代码吧。
授权操作呢?有点像见过她的父母后,她的父母给你开出的条件,比如:房子、车子啊之类的才准你们结婚,简单点来说就是:“小伙子,我看你也是好小伙子,把我女儿托付给你我们俩老也放心,但是我们不希望我们闺女受苦,所以你需要做到以下几点,否则你不能和我女儿做到以下几件是。”然后你的岳父拿着对话框给你画了一个表格。
总结来说就是:
- 中间件是大门,进了大门不代表就是女婿,但是连大门都进不了,那么肯定连机会都没有了
- 授权是要求,是针对只是当男朋友还是当老公,具体到控制器下的对应各个方法的一个限制
下面讲解具体的操作,我的laravel版本是5.4.20。
中间件
我看到的例子是在该控制器的__construct中设置了中间件:
<?php
public function __construct(){
$this->middleware('auth',['only'=>['edit','update']])
}
?>
上面这个设置是神马意思呢?$this->middleware()
是Laravel
内置的一个方法,用于设置中间件的调用的。auth
是要调用的中间件的名字,该名字和具体文件的映射关系被保存在app/Http/Kernel.php
中,该文件中有这么一句话:
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
所以这里就是调用了这个内置类,这个内置类的其中一个默认操作就是当未登录状态时(Auth::login()进行判断),去访问后面设置的方法,则默认跳转到login路由中。至于你把login路由连接到哪里了,那就看你代码的具体情况了。
最后是only=>['edit','update']
,这里表示仅当你访问这两个方法的时候,才会进行中间件的验证,其余方法随便,还有一个与only
相反的操作expect
,expect=>['edit','update']
,表示除了edit和update
之外的都使用中间件进行匹配。
如何自定义中间件
I don’t know …..
教程上没有,而光弄懂这个东西,就花了我一个下午了,之后回来补吧。
授权
首先你可以直接使用命令行来创建一个授权文件:
# 在项目的根目录下运行下面的命令,所谓根目录就是你的artisan文件所在的那个路径
php artisan make:policy PolicyFileName
如我要创建一个UserPolicy.php
,那么我就运行:
php artisan make:policy UserPolicy
之后就会在app/Http/Policies
下创建一个新的文件,这里顺道把那个文件代码贴一下:
<?php
namespace App\Policies;
use App\Models\User;
use Illuminate\Auth\Access\HandlesAuthorization;
class UserPolicy
{
use HandlesAuthorization;
public function update(User $currentUser,User $user){
return $currentUser->id===$user->id;
}
// public function edit(User $currentUser,User $user){
// return $currentUser->id===$user->id;
// }
}
现在文件授权文件创建好了,剩下还有一个文件要修改。
AuthServiceProvider.php
这个文件的路径是:app\Providers
下,在其中把我们新建的这个授权文件添加进去:
protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy',
//这里就是我们新加的内容
User::class=>UserPolicy::class
];
注意对User
和UserPolicy
的命名空间的设置,否则会显示查不到该文件。
调用该授权类
在UserPolicy.php
中只需要直接调用:
$user=User::findOrFail($id);
$this->authorize('update',$user);
就能进行验证,这里的update
就是我们上面创建的UserPolicy.php
中设置的方法,只有在里面设置了的方法才能在对应的控制器中被调用。
如何被调用到的?
其中我们直接是写了$this->authorize()
就显式的调用到了这个类。将两者联系在一起的就是最开始配置的AuthServiceProvider.php文件,其中把模型:User和UserPolicy进行了匹配,所以当进行user模型的操作时,自动调用UserPolicy进行授权验证。