在用户登录之后,可以使用laravel中的权限策略(policy)给用户的操作进行权限控制。比方说,当不是管理员登录时,只能看而不能修改别人的信息,也不能删除别人以及自己的用户信息,只有管理员能修改别人的用户信息,以及删除别人的用户信息
1、生成一个策略文件
通过如下命令生成策略类文件,比方说用户策略类
php artisan make:policy UserPolicy
也可以在生成文件的同时指定管理的模型
php artisan make:policy UserPolicy --model=User
2、在策略类文件中书写我们的授权逻辑
在文件中,可以使用如下方法在更新时进行权限控制
public function update(User $user, User $model)
{
return $user['is_admin'] || $user->id == $model->id;
}
判断是否是管理员或者操作的是否是自己的账号
在策略类的方法中,返回true
代表用户被授权,有权限做此操作,如果返回的是false
,代表用户不被授权,没有权限做此操作
update
方法的第一个参数是登录的用户,框架会自动帮我们自动加载,不需要我们自己传值,第二个参数是需要授权的用户实例,需要我们自己传值,意思就是$user
所代表的用户是否被授权对$model
实例进行操作
3、注册生成的策略
生成的策略文件需要注册后才能使用,注册的方法:
在app/Providers/
目录里面的AuthServiceProvider.php
文件中的$policies
属性中,进行注册
'App\User' => UserPolicy::class
键名指的是需要授权管理的模型,键值指的是使用哪种策略类来进行管理
4、使用策略
①在控制器的方法中使用策略,通过框架提供的authorize
方法
$user = User::find($id);
$this->authorize('update',$user);
authorize
方法的第一个参数是该模型对应的策略类中的方法名称,第二个参数需要授权的实例;如果授权通过,那么将继续执行下面的操作,如果不被授权,那么该动作就会抛出一个异常
②通过blade模版使用策略
@can('update', $user)
<!-- 当前用户可以进行的操作 -->
@endcan
其中@can
传递的第一个参数是模型对应的策略类里的方法名称,第二个参数是需要授权的实例
网友评论