付费课程, 订阅后即可观看
Laravel API 接口开发
18 集视频
2小时13分钟
本期Laravel视频我们学习一下话题更新接口的实现,本期视频咱们正式引入gate和policy对用户的权限进行判断,看用户是否有权限进行话题更新的操作,使用这种方式进行API开发,就可以把代码组织的更合理,功能进行更好的分离
$this->middleware('auth:api')->except(['index', 'show']); $this->authorizeResource(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信息,就头大了。
不是水品有限,而是你非常用心,所以能跟踪和推理出想要的答案
php artisan make:policy TopicPolicy --model=Topic 在这之后。。。我update方法一直提示”This action is unauthorized.“ 然后我将 TopicPolicy删除 以及authorize 和 construct中的authorizeResource进行了删除,目前还是会提示error“This action is unauthorized.”。断点也打上,现在就是找不出原因在哪里了。。
你用文章作者的环境变量试了吗?只能一点点排除了,该打log的地方都打上log吧
环境变量也进行了更改。嗯 只能这样了,create show index 都ok。。。就很奇怪 而且断点也打不上去。我直接在update function 最上层直接dd + die 两个都不行
还是靠log吧,我反正不习惯用断点,我觉得它效率太低了。
自定义的validate request中也进行了权限验证!` public function authorize()
{
return false; //就是这里
}`
。。。。。。。。。
这就是我上一个评论一直失败的原因
今天无事又去把以前跟你视频写的代码拉下来继续干。因为上次的bug一直在我心里是个疙瘩。现在终于舒服了
因为你视频中复用了request 而我为了培养这个习惯重新写了一个,时隔三个月。。。
不容易啊,你还是很能坚持的,祝贺闯关成功
关于 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 的版本, 其他的版本就不清楚了
我都忘了我过去录过啥了,还好有各位帮忙丰富和完善。
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)->id === $post->user_id; } }
在对用户更新文章做授权的时候,是不是也可以直接在TopicPolicy的update方法中这样写啊
public function delete(User $user, Topic $topic)
{
return $user->id === $topic->user_id;
},
而不用再自己定义方法了,我试过效果上是可以的,但是不知道这种写法有问题吗?qwq
当然可以,只要能判断权限就行,至于最终采取那种方案,看项目需要
哦哦,明白了,感谢指点