创建中间件
php artisan make:policy UserPolicy
所有生成的授权策略文件都会被放置在 app/Policies
文件夹下。
让我们为默认生成的用户授权策略添加 update
方法,用于用户更新时的权限验证
app/Policies/UserPolicy.php
<?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; } }
update
方法接收两个参数,第一个参数默认为当前登录用户实例,第二个参数则为要进行授权的用户实例。当两个 id 相同时,则代表两个用户是相同用户,用户通过授权,可以接着进行下一个操作。如果 id 不相同的话,将抛出 403 异常信息来拒绝访问。
对中间件进行注册
app/Providers/AuthServiceProvider.php
protected $policies = [ 'App\Model' => 'App\Policies\ModelPolicy', \App\Models\User::class => \App\Policies\UserPolicy::class, ];
授权策略定义完成之后,我们便可以在控制器中使用 authorize
方法来检验用户是否授权
$this->authorize('update', $user);
我们需要为 edit
和 update
方法加上这行:
public function edit(User $user) { $this->authorize('update', $user); return view('users.edit', compact('user')); } public function update(UserRequest $request, ImageUploadHandler $uploader, User $user) { $this->authorize('update', $user); $data = $request->all(); if ($request->avatar) { $result = $uploader->save($request->avatar, 'avatars', $user->id, 362); if ($result) { $data['avatar'] = $result['path']; } } $user->update($data); return redirect()->route('users.show', $user->id)->with('success', '个人资料更新成功!'); }
然后2号用户 访问 1 号用户的修改资料页面 的时候,用户不是一个人,系统将会拒绝访问: