Laravel 检查权限(Policy)

Laravel 要增加权限控制,只允许相应用户来操作某些权限,这里通过授权策略类(Policy)来实现权限控制:

$ php artisan make:policy UserAddressPolicy

新创建的 Policy 文件位于 app/Policies 目录下。

UserAddressPolicy 类中新建一个 own() 方法:

app/Policies/UserAddressPolicy.php

use App\Models\UserAddress; //引入用户地址模型
.
.
.
    public function own(User $user, UserAddress $address)
    {
        return $address->user_id == $user->id;
    }

own() 方法返回 true 时代表当前登录用户可以修改对应的地址。

接下来还需要在 AuthServiceProvider 注册这个授权策略,从 Laravel 5.8 起,我们可以定义一个回调函数来让 Laravel 自己去寻找模型所对应的授权策略文件:

app/Providers/AuthServiceProvider.php

.
.
.
    public function boot()
    {
        $this->registerPolicies();

        // 使用 Gate::guessPolicyNamesUsing 方法来自定义策略文件的寻找逻辑
        Gate::guessPolicyNamesUsing(function ($class) {
            // class_basename 是 Laravel 提供的一个辅助函数,可以获取类的简短名称
            // 例如传入 \App\Models\User 会返回 User
            return '\\App\\Policies\\'.class_basename($class).'Policy';
        });
    }
.
.
.

最后在控制器中添加校验权限的代码:

app/Http/Controllers/UserAddressesController.php

.
.
.
    public function edit(UserAddress $user_address)
    {
        $this->authorize('own', $user_address);

        return view('user_addresses.create_and_edit', ['address' => $user_address]);
    }

    public function update(UserAddress $user_address, UserAddressRequest $request)
    {
        $this->authorize('own', $user_address);
        .
        .
        .
    }

    public function destroy(UserAddress $user_address)
    {
        $this->authorize('own', $user_address);
        .
        .
        .
    }

代码解析:

authorize('own', $user_address) 方法会获取第二个参数 $user_address 的类名: App\Models\UserAddress,然后执行我们之前在 AuthServiceProvider 类中定义的自动寻找逻辑,在这里找到的类就是 App\Policies\UserAddressPolicy,之后会实例化这个策略类,再调用名为 own() 方法,如果 own() 方法返回 false 则会抛出一个未授权的异常。

总结:
1.在 app/Policies 目录下创建策略文件 UserAddressPolicy
2.在 AuthServiceProvider 注册这个授权策略 在boot中用 Gate::guessPolicyNamesUsing 方法来自定义策略文件的寻找逻辑.
3.最后在控制器中添加校验权限的代码

阅读 220

Comments