付费课程, 订阅后即可观看

Laravel API 接口开发

18 集视频
2小时13分钟

本期Laravel视频我们学习一下话题更新接口的实现,本期视频咱们正式引入gate和policy对用户的权限进行判断,看用户是否有权限进行话题更新的操作,使用这种方式进行API开发,就可以把代码组织的更合理,功能进行更好的分离

llkllc 2019.06.10 16:12

$this-&gtmiddleware('auth:api')-&gtexcept(['index', 'show']); $this-&gtauthorizeResource(Topic::class);

水平有限也要来发表一下。auth中间件,有解析access_token并登陆用户的功能(测试方法:打开/关闭auth中间件的except,postman带上token,在index或者show方法中打印user信息),在auth中间件上except了index和show,所以并没有登陆用户,因此在authorizeResource中,在某一步获取用户信息时失败了,没有真正走到TopicPolicy。跟踪到Illuminate\Auth\Access\Gate.php@raw方法下有$user信息,就头大了。

国营 2019.06.11 00:00

不是水品有限,而是你非常用心,所以能跟踪和推理出想要的答案

王大狗_Bibili 2019.07.10 08:47

php artisan make:policy TopicPolicy --model=Topic 在这之后。。。我update方法一直提示”This action is unauthorized.“ 然后我将 TopicPolicy删除 以及authorize 和 construct中的authorizeResource进行了删除,目前还是会提示error“This action is unauthorized.”。断点也打上,现在就是找不出原因在哪里了。。

国营 2019.07.10 09:10

你用文章作者的环境变量试了吗?只能一点点排除了,该打log的地方都打上log吧

王大狗_Bibili 2019.07.10 09:11

环境变量也进行了更改。嗯 只能这样了,create show index 都ok。。。就很奇怪 而且断点也打不上去。我直接在update function 最上层直接dd + die 两个都不行

国营 2019.07.10 09:15

还是靠log吧,我反正不习惯用断点,我觉得它效率太低了。

王大狗_Bibili 2019.10.15 07:19

自定义的validate request中也进行了权限验证!` public function authorize()

{

return false; //就是这里

}`

。。。。。。。。。

这就是我上一个评论一直失败的原因

今天无事又去把以前跟你视频写的代码拉下来继续干。因为上次的bug一直在我心里是个疙瘩。现在终于舒服了

因为你视频中复用了request 而我为了培养这个习惯重新写了一个,时隔三个月。。。

国营 2019.10.15 07:27

不容易啊,你还是很能坚持的,祝贺闯关成功

小人物1号 2020.03.31 05:25

关于 TopicPolicy.php View 方法不好使的问题做了一些调查, 用的 laravel 7

第1种情况是, 用户登录后, view 使用正常 第2种情况是, 让 view 和 index 不做权限验证, 跳过验证部分

下面介绍的是第2种 $this->authorizeResource(Topic::class);

调查发现,这段代码的作用就是, 帮助我们调用几个方法,如下: $this->middleware('can:viewAny,App\Model\Topic')->only(['index']) $this->middleware('can:view,topic')->only(['show']) $this->middleware('can:create,App\Model\Topic')->only(['create','store']) $this->middleware('can:update,topic')->only(['edit','update']) $this->middleware('can:delete,topic')->only(['destroy'])

可以推断出是中间件的使用问题, 又看到 authorizeResource 方法的第三个函数是一个和 $this->middleware('auth:api')->except(['index','show']); 中的 except方法很像的参数, 最终效果如下, 测试正常

$this->authorizeResource(Topic::class, null, ['except'=>['index','show']]);

最终生成 $this->middleware('can:viewAny,App\Model\Topic')->only(['index'])->except(['index','show']) $this->middleware('can:view,topic')->only(['show'])->except(['index','show']) $this->middleware('can:create,App\Model\Topic')->only(['create','store'])->except(['index','show']) $this->middleware('can:update,topic')->only(['edit','update'])->except(['index','show']) $this->middleware('can:delete,topic')->only(['destroy'])->except(['index','show'])

因为刚开始学习php , 只测试了 laravel 7 的版本, 其他的版本就不清楚了

国营 2020.03.31 05:44

我都忘了我过去录过啥了,还好有各位帮忙丰富和完善。

vince 2020.08.12 03:09

Laravel7中可以通过声明一个「可选」类型提示或为用户参数定义提供一个 null 默认值

namespace App\Policies;

use App\Post; use App\User;

class PostPolicy { /** * Determine if the given post can be updated by the user. * * @param \App\User $user * @param \App\Post $post * @return bool */ public function update(?User $user, Post $post) { return optional($user)-&gtid === $post-&gtuser_id; } }

xiaosheng 2020.05.23 14:51

在对用户更新文章做授权的时候,是不是也可以直接在TopicPolicy的update方法中这样写啊

public function delete(User $user, Topic $topic)

{

return $user-&gtid === $topic-&gtuser_id;

},

而不用再自己定义方法了,我试过效果上是可以的,但是不知道这种写法有问题吗?qwq

国营 2020.05.23 15:42

当然可以,只要能判断权限就行,至于最终采取那种方案,看项目需要

xiaosheng 2020.05.23 16:20

哦哦,明白了,感谢指点

微信扫码登录