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对应的用户实列。,再这里验证不通过,就不执行后面的内容。

 

posted @ 2018-05-14 17:05  沐屋  阅读(910)  评论(0编辑  收藏  举报