衷心感谢改版期间大家给予的帮助和体谅

微信登录

微信登录

因恶意注册过多,目前只支持微信模式
付费课程, 订阅后即可观看
正在播放:API 接口开发 - topic 话题更新接口的实现
发布于: 2019.04.19
llkllc 2019.06.11 12: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信息,就头大了。

codinget 2019.06.11 08:00

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

王大狗_Bibili 2019.07.10 04:47

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

codinget 2019.07.10 05:10

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

王大狗_Bibili 2019.07.10 05:11

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

codinget 2019.07.10 05:15

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

王大狗_Bibili 2019.10.15 03:19

自定义的validate request中也进行了权限验证! public function authorize() { return false; //就是这里 } 。。。。。。。。。 这就是我上一个评论一直失败的原因 今天无事又去把以前跟你视频写的代码拉下来继续干。因为上次的bug一直在我心里是个疙瘩。现在终于舒服了 因为你视频中复用了request 而我为了培养这个习惯重新写了一个,时隔三个月。。。

codinget 2019.10.15 03:27

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

小人物1号 2020.03.31 01: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 的版本, 其他的版本就不清楚了

codinget 2020.03.31 01:44

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

vince 2020.08.12 11: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 10:51

在对用户更新文章做授权的时候,是不是也可以直接在TopicPolicy的update方法中这样写啊 public function delete(User $user, Topic $topic) { return $user-&gtid === $topic-&gtuser_id; }, 而不用再自己定义方法了,我试过效果上是可以的,但是不知道这种写法有问题吗?qwq

codinget 2020.05.23 11:42

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

xiaosheng 2020.05.24 12:20

哦哦,明白了,感谢指点

标 题
找一条适合自己的路,坚持走下去
编程原力 京ICP备17045322号-2
版权所有, 侵权者追究法律责任