laravel 权限控制及验证
之前已经写过了,如果对一些页面进行限制,只有登陆了才可以访问,使用的是Auth认证,其方法是把做好的中间件加再路由上,除了加再路由上,还可以放在控制器中。
再控制器中创建构造方法:
public function __construct()
{
$this->middleware( ' aurh' , [ ' except' => [ ' show ' ] ] )
}
except为除。。。之外,这里表示,除了show方法return的view页面之外,都会进行auth认证,没有登陆就进不去。
现在来说用户权限,用户登陆了,url会有用户的id,当我想要编辑自己的信息时,我去更改url上的用户id,也可以去更改别人的信息,这里就要做一个权限认证,判断当前登陆用户,与要去操作的用户id是否相等,不等就报错。比如id为7的用户要登陆,我拿当前这个7去和当前登陆用户的id对比,一致既通过。
具体方法:
创建policy权限:php artisan make:policy UserPolict 这个会在 app 目录下创建一个文件夹 Polices 文件夹存放,权限管理文件。
创建好后去注册,打开 Providers 文件夹(服务提供者的意思) 打开 AuthServiceProvider.php 再 policies 属性中添加上User权限管理:
\App\User::class => \App\Policies\UserPolicy::class,
注册上了,就可以去编写权限规则了:
需要对控制器中的哪个方法实现权限管理,就创建哪个方法
public function store(User $currentUser , User $user)
{
return $currentUser->id === $user->id;
}
说明:我对控制器中的头像上传方法进行权限认证,判断你有没有权限更换头像,再这个里面创建一个store同样的方法,需要两个参数:
第一个参数默认为当前登录用户实例,第二个参数则为要进行授权的用户实例
第一个User $currentUser ,此处依赖注入,得到的是权限policy自带的功能,它会自己获取到当前登陆用户的实例
第二个User $user ,此处依赖注入,为当前操作的用户,此处的用户是通过url传递过来的用户id参数进行模型查找实力化的user,也就是说:
url传递过来的id是几,此时user模型实列的就是id对应的用户,这里通过url更改id,将这个id和登陆用户的id 对比 。
即可返回一个布尔值,true为一样,false为不一样。
接下来要再控制器中,进行权限验证,当url路由到控制器中的方法时,就开始验证,方法为:
$this->authorize( ' store ' , $user ); 此处传递两个参数,第一个为方法,表示验证哪个方法的权限,会到权限文件里面找那个对应的方法进行验证,
第二个为当前授权的用户实力,也就是url传递过来id对应的用户实列。,再这里验证不通过,就不执行后面的内容。