Auth :: user () возвращает ноль в API-контроллере - PullRequest
0 голосов
/ 05 апреля 2020

Я использую Laravel 7, и моя проблема состоит в том, чтобы получить null от Auth :: user (); auth () -> user и Auth :: id () также возвращают null.

Кстати, в шаблоне balde Auth :: user () работает. Он возвращает null, когда я пытаюсь использовать его в контроллере.

Я пытаюсь создать страницу комментариев в бэкэнде (Vuejs), и я хочу создать фильтр logi c , Для этого я хочу добавить новое свойство с именем repliedBy в каждый комментарий в контроллере. Если текущий пользователь не ответил на комментарий, он ответил notByMe. Поэтому я не пытаюсь вернуть идентификатор пользователя на Vuejs. Я не могу получить идентификатор даже в контроллере. Кстати, логин, регистрация и т. Д. c работают в обычном режиме.

Вот мой КомментарииКонтроллер:

    public function index()
    {
        $comments = Comment::join("site_languages", "language_id", "=", "site_languages.id")
            ->select("content_comments.*", "site_languages.shorthand as lang_shorthand")
            ->with(["replies", "post", "user"])
            ->orderBy('id', 'desc')
            ->get()
            ->groupBy("commentable_type");

        $grouppedComments = [];
        foreach ($comments as $type => $typeSet) {
            $newType = strtolower(explode("\\", $type)[1]);
            $grouppedByLanguage = $typeSet->groupBy("lang_shorthand");
            $langSet = [];
            foreach ($grouppedByLanguage as $lang => $commentSet) {
                $grouppedBycontent = [];
                foreach ($commentSet as $comments) {
                    $content = $newType . "_" . $comments->commentable_id;
                    if (array_key_exists($content, $grouppedBycontent)) {
                        array_push($grouppedBycontent[$content], $comments);
                    } else {
                        $grouppedBycontent[$content] = [$comments];
                    }
                }
                $groupAfterOrganized = [];
                foreach ($grouppedBycontent as $content => $comments) {
                    $order = 1;
                    $commentAndReplies = [];
                    foreach ($comments as $comment) {
                        if ($comment->parent_id === null) {
                            if (isset($comment->order) === false || $comment->order > $order) {
                                $comment->order = $order;
                            }
                            array_push($commentAndReplies, $comment);
                        } else {
                            foreach ($comments as $parentComment) {
                                if ($parentComment->id === $comment->parent_id) {
                                    $parent = $parentComment;
                                    break;
                                }
                            }
                            foreach ($parent->replies as $replyInParent) {
                                if ($replyInParent->id === $comment->id) {
                                    $reply = $replyInParent;
                                    break;
                                }
                            }
                            if (isset($comment->order) === false) {
                                $comment->order = $order;
                                $order++;
                            }
                            if (isset($parent->order) === false || $parent->order > $comment->order) {
                                $parent->order = $comment->order;
                            }
                            $reply->order = $comment->order;
                            $reply->replies = $comment->replies;
                            $reply[$newType] = $comment[$newType];
                            $basePower = 6;
                            if ($comment->user_id !== null) {
                                if ($comment->user_id === Auth::id()) {
                                    $reply->replyFrom = "me";
                                } else if ($comment->user->role->power >= $basePower) {
                                    $reply->replyFrom = "staff";
                                } else {
                                    $reply->replyFrom = "user";
                                }
                            } else {
                                $reply->replyFrom = "visitor";
                            }
                            $iReplied = false;
                            $staffReplied = false;
                            foreach ($reply->replies as $replyOfReply) {
                                if ($replyOfReply->user_id !== null) {
                                    $power = $replyOfReply->user->role->power;
                                    if ($power >= $basePower) {
                                        $staffReplied = true;
                                    }
                                }
                                if ($replyOfReply->user_id === Auth::id()) {
                                    $iReplied = true;
                                }
                            }
                            if ($staffReplied === false) {
                                if ($reply->replyFrom === "user" && $reply->replyFrom === "visitor") {
                                    $reply->replied = "notReplied";
                                } else {
                                    $reply->replied = "lastWords";
                                }
                            } else if ($staffReplied && $iReplied === false) {
                                $reply->replied = "notByMe";
                            } else if ($staffReplied) {
                                $reply->replied = "replied";
                            }
                        }
                    }
                    $groupAfterOrganized[$content] = $commentAndReplies;
                }
                $langSet[$lang] = $groupAfterOrganized;
            }
            $grouppedComments[$newType] = $langSet;
        }
        return $grouppedComments;
    }

API. php

Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});

Route::apiResources([
    'languages'     => 'API\LanguagesController',
    'users'         => 'API\UsersController',
    'roles'         => 'API\RolesController',
    'tags'          => 'API\TagsController',
    'categories'    => 'API\CategoryController',
    'pictures'      => 'API\PicturesController',
    'posts'         => 'API\PostsController',
    'comments'      => 'API\CommentsController'
]);

РЕДАКТИРОВАТЬ

Я использую код ниже в RedirectIfAuthenticated. php, и когда я пытаюсь использовать

dd(Auth::user());

, он также возвращает ноль. Кстати, перенаправление на сервер не работает.

public function handle($request, Closure $next, $guard = null)
{
    if (Auth::guard($guard)->check()) {
        if (Auth::user()->role->power > 5) {
            return redirect('backend');
        }
        return redirect(RouteServiceProvider::HOME);
    }
    return $next($request);
}

1 Ответ

0 голосов
/ 05 апреля 2020

Решение этой проблемы довольно простое. потому что вы используете API-запрос laravel по умолчанию auth не может понять пользователя, поэтому вот паспорт приходит:

https://laravel.com/docs/7.x/passport

, как написано в документации, вы должны go 3 шага:

composer require laravel/passport
php artisan migrate
php artisan passport:install

после этого вы можете сгенерировать токен для зарегистрированных пользователей и использовать этот токен в аутентификации API для использования в вашем API, что является единственным и более надежным способом laravel аутентификации по умолчанию. эта ссылка также может быть полезна для вас:

https://laravel.io/forum/laravel-passport-vue-check-user-authentication

таким образом, если вы собираетесь использовать свой API в мобильном или любом другом приложении, вы можете просто аутентифицировать своего пользователя в этом :) надеюсь, это поможет

РЕДАКТИРОВАТЬ

в соответствии с вашим комментарием теперь вы должны сгенерировать токен для вашего vue API, чтобы использовать его так, как показано ниже:

  $token    = $user->createToken(config('app.name'))->accessToken;

        if ($this->isApiType()) {
            $token = $user->createToken(config('app.name'))->accessToken;
        } else {
            Auth::login($user);
            $redirect = $this->getRedirectTo($user);
        }

это должно быть добавлено в конце ваш метод входа в систему, поэтому, если запрос приходит от API, он генерирует для вас токен JWT, который можно использовать в vue для входа в систему

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...