Laravel 自带很多权限认证,本小节先简单的介绍一下策略类来验证权限。
使用场景:判断用户对指定的文章是否有删除权限等相关场景。
用户收货地址策略类
>$ php artisan make:policy UserAddressPolicy
<?php
namespace App\Policies;
use App\Models\User;
use App\Models\UserAddress;
use Illuminate\Auth\Access\HandlesAuthorization;
class UserAddressPolicy
{
use HandlesAuthorization;
/**
* Create a new policy instance.
*
* @return void
*/
public function __construct()
{
//
}
public function own( User $user, UserAddress $address )
{
return $user->id == $address->user_id;
}
}
自定义own方法,第一个参数是当前登录用户,第二个参数是收货地址信息。判断收货地址的user_id是不是当前用户,返回判断的结果。如果,校验通过,则程序继续执行;否则,会返回一个403的无权限异常。
注册策略类
// AuthServiceProvider
...
use App\Models\UserAddress;
use App\Policies\UserAddressPolicy;
...
protected $policies = [
UserAddress::class => UserAddressPolicy::class,
];
使用策略类
Laravel 提供了很多种校验权限的方法,这里先介绍一下在控制器里使用辅助函数来调用:
public function destroy( UserAddress $user_address )
{
$this->authorize('own', $user_address);
$user_address->delete();
return [];
}
解释下这段代码执行流程:
authorize('own', $user_address) 方法会获取第二个参数 $user_address 的类名:App\Models\UserAddress
然后在 AuthServiceProvider 类的 $policies 属性中寻找对应的策略,这里就是 App\Policies\UserAddressPolicy,找到后会实例化这个策略类,再调用名为 own() 方法,如果 own() 方法返回 false 则会抛出一个未授权的异常。
由于能力有限,不足或有不解之处,希望在下方评论区与我讨论,共同提高 。