Можно ли использовать Auth :: user () на неаутентифицированных маршрутах? - PullRequest
2 голосов
/ 21 февраля 2020

Это должно быть что-то действительно легкое, но у меня нет большого опыта в Laravel, и я безуспешно искал и старался.

Я работаю над существующим проектом и у него есть несколько маршрутов, использующих промежуточное ПО auth:api, например:

Route::group(['namespace' => 'Api', 'prefix' => 'api', 'middleware' => 'auth:api', 'throttle:100,1'], function () {

    // Route.....

});

Внутри любого контроллера для этих маршрутов Auth :: user () работает нормально и возвращает зарегистрированный пользовательский экземпляр. Пока все хорошо.

Теперь у меня есть другой набор маршрутов, которые публикуются c, поэтому они не используют промежуточное ПО auth:api. Тем не менее, вошедший в систему пользователь также может получить доступ к этим маршрутам, и на основании этого условия (вне зависимости от того, вошел в систему или нет) я хочу запустить дополнительные logi c. Подводя итог, можно сказать, что страница доступна как зарегистрированным пользователям, так и пользователям c; но если пользователь залогинен, мы запускаем дополнительный лог c. Однако, когда я пытаюсь использовать Auth::user(), он возвращает ноль, а auth()->check() возвращает ложь.

Помните, я не могу использовать промежуточное программное обеспечение для аутентификации, поскольку это ограничит доступ пользователей publi c к странице. что не то, что нам нужно.

Ответы [ 4 ]

1 голос
/ 21 февраля 2020

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

https://laravel.com/docs/5.7/authentication#authenticating -пользователей

Это может быть полезно, а также

1 голос
/ 21 февраля 2020

Вы должны использовать аутентификацию с охраной.

{{ \Auth::guard('api')->user(); }}
0 голосов
/ 21 февраля 2020

Несмотря на то, что вызов Auth::guard('api')->user() работает, мне очень некрасиво устанавливать настройку по умолчанию каждый раз, когда вы пытаетесь получить доступ к аутентифицированному пользователю.

Что вы можете сделать, это создать новое промежуточное ПО, которое устанавливает защита по умолчанию для указанных c маршрутов.

Создать новое промежуточное ПО:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Contracts\Auth\Factory as Auth;

class DefaultGuard
{
    /**
     * The authentication factory instance.
     *
     * @var Auth
     */
    protected $auth;

    /**
     * Create a new middleware instance.
     *
     * @param Auth $auth
     *
     * @return void
     */
    public function __construct(Auth $auth)
    {
        $this->auth = $auth;
    }

    /**
     * Handle an incoming request.
     *
     * @param         $request
     * @param Closure $next
     * @param         $guard
     *
     * @return mixed
     */
    public function handle($request, Closure $next, $guard)
    {
        $this->auth->shouldUse($guard);

        return $next($request);
    }
}

Добавить его в свойство $routeMiddleware в app\Http\Kernel.php

protected $routeMiddleware = [
    'guard' => DefaultGuard::class,
];

Примените его к вашим публикуемым c маршрутам:

Route::group([ 'middleware' => 'guard:api'], function () {
    // Route.....
});

Теперь вы можете получить доступ к аутентифицированному пользователю, как обычно, например:

Auth::user();
$request->user();
etc.
0 голосов
/ 21 февраля 2020

Кроме того, вы можете получить доступ к аутентифицированному пользователю через экземпляр Illuminate \ Http \ Request.

Expl

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ProfileController extends Controller
{
    /**
     * Update the user's profile.
     *
     * @param  Request  $request
     * @return Response
     */
    public function update(Request $request)
    {
        // $request->user() returns an instance of the authenticated user...
    }
}

Чек Документация

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