【问题标题】:Laravel 5.5 Authorization Policy Not Being CalledLaravel 5.5 授权策略未被调用
【发布时间】:2017-12-04 04:45:24
【问题描述】:

从 Home.vue 登录调用

methods: {
  login: function (e){
   e.preventDefault();
   this.standing = true; // Disables Login Button
   axios.post('/oauth/token', {
    email: this.email, // I verify with email
    password: this.password,
    username: this.username,
    grant_type: 'password',
    client_id: integer_of_client_id,
    client_secret: 'secret_token',
  }).then({response => {
     window.axios.defaults.headers.common['Authorization'] = 'Bearer '+ response.data.access_token;
     // Make call to /api/user
// ...

好的,所以我在这里仔细检查了我的命名空间,但我无法弄清楚 Laravel 是如何缺少我创建的这个策略的:

Reply.vue 上的 AXIOS CALL(删除回复)

axios.delete('/api/barracks/reply/delete/' + this.reply.id, { id: this.reply.id });

ROUTES/API.PHP

Route::delete('/barracks/reply/delete/{forumReply}','ForumRepliesController@destroy');

控制器

public function destroy(ForumReply $forumReply)
{

    $this->authorize('destroy', $forumReply);

    $forumReply->delete();

    return response()->json(['Success',204]);
}

AuthServiceProvider.php

// ... Stuff
use App\ForumReply;
use App\Policies\ForumReplyPolicy;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [
        ForumReply::class => ForumReplyPolicy::class
    ];

    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();
        // Passport Stuff
    }
}

FourmReplyPolicy.php

namespace App\Policies;

use App\User;
use App\ForumReply;
use Illuminate\Auth\Access\HandlesAuthorization;

class ForumReplyPolicy
{
    use HandlesAuthorization;
    public function destroy(User $user, ForumReply $forumReply)
    {
        return true;
    }
}

响应

我收到了来自 Laravel 的 403 响应,我这辈子都找不到原因。

【问题讨论】:

  • 您确定当前用户已通过身份验证吗?
  • 当我将 auth()->id() 返回到控制器方法时,它会返回正确的用户 ID。 ://
  • 如果你返回 $user->id === $forumReply->user_id; (假设你有一个 $forumReply->user_id)而不是仅仅在你的策略中返回 true
  • 在文档中阅读即可。没关系。它应该返回真或假,所以请忽略我的评论。
  • 如果你在控制器中的授权方法之前 dd($forumReply) 怎么办?

标签: php laravel vue.js http-status-code-403 laravel-passport


【解决方案1】:

对于任何来到这个线程并使用带有->中间件的 web.php 路由的人

我遇到了同样的问题,即没有在这一行调用策略:

    Route::get('/post', 'PostController@index')
        ->middleware('can:index, App\Post');

问题是索引之间的空格字符,App.. 删除后它可以工作。

【讨论】:

  • 我们应该使用 API 中间件来处理 API 请求
【解决方案2】:

所以在玩了很多之后,我发现了一个临时的解决方法,不幸的是有点难看。我已将它插入到每个必要控制器的开头。

$user = \JWTAuth::toUser(\JWTAuth::getToken());
\Auth::loginUsingID($user->id);

然后我可以使用授权策略并检索经过身份验证的用户信息。

【讨论】:

    猜你喜欢
    • 2019-05-04
    • 2017-10-12
    • 2017-02-05
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    相关资源
    最近更新 更多