应用场景:
假设本人的用户uid=1吗,现在我想修改个人资料user/1/edit,这时候,当我输入user/2/edit时,也能进入用户为2的个人资料进行修改。在laravel中
public function __construct()
{
$this->middleware('auth', ['except' => ['show']]);
}
在完成对未登录用户的限制之后,接下来我们要限制的是已登录用户的操作。当 id 为 2 的用户去尝试更新 id 为 1 的用户信息时,我们应该返回一个 403 禁止访问的异常。在 Laravel 中可以使用 授权策略 (Policy) 来对用户的操作权限进行验证,在用户未经授权进行操作时将返回 403 禁止访问的异常。
我们可以使用以下命令来生成一个名为 UserPolicy
的授权策略类文件,用于管理用户模型的授权。
实例:$php artisan make:policy UserPolicy创建一个授权策略类文件,生成的文件在app/Policies
打开UserPolicy.php,加入下面这行代码
update
方法接收两个参数,第一个参数默认为当前登录用户实例,第二个参数则为要进行授权的用户实例。当两个 id 相同时,则代表 两个用户是相同用户,用户通过授权,可以接着进行下一个操作。如果 id 不相同的话,将抛出 403 异常信息来拒绝访问。
public function update(User $currentUser, User $user)
{
return $currentUser->id === $user->id;
}
在这里面我们不需要判断currentUser是否为null,null代表用户是没有登录直接,框架会直接返回false
接下来我们需要AuthServiceProvider
这里进行注册,里面存在一个$policies如下:
我们需要用户user指定接收UserPolicy授权类
protected$policies=[
'App\Model'=>'App\Policies\ModelPolicy',
\App\Models\User::class=> \App\Policies\UserPolicy::class,
];
接下来我们在浏览器中可以直接使用authorize
进行检测用户是否授权$this->authorize('update',$user);
注解:这里 update
是指授权类里的 update
授权方法,$user
对应传参 update
授权方法的第二个参数。
正如上面定义 update
授权方法时候提起的,调用时,默认情况下,我们 不需要 传递第一个参数,
也就是当前登录用户至该方法内,因为框架会 自动 加载当前登录用户。
欢迎加入laravel进阶群