是否可以在未经身份验证的路由上使用Auth :: user()?

问题描述 投票:1回答:4

这确实很容易,但是我在Laravel方面没有很多经验,而且我一直在寻找和尝试,没有运气。

我正在开发一个现有项目,并且它的某些路由使用auth:api中间件,例如:

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

    // Route.....

});

在这些路由的任何控制器中,Auth :: user()都可以正常工作,并返回已登录的用户实例。到目前为止,一切都很好。

现在,我还有另一套路由是公用的,因此它们不使用auth:api中间件。但是,已登录的用户也可以访问这些路由,并且基于此条件(无论是否已登录),我想运行其他逻辑。综上所述,登录页面和公共用户均可访问该页面。但是如果用户已登录,我们将运行其他逻辑。但是,当我尝试使用Auth::user()时,它返回null,而auth()->check()返回false。

请记住,我不能使用auth中间件,因为这将限制公共用户访问页面,这不是我们所需要的。

php laravel
4个回答
1
投票

如果用户有需要认证的信息,可以在用户请求路由时手动认证用户。如果他不这样做,那么您可以对未经身份验证的用户使用您的逻辑。

https://laravel.com/docs/5.7/authentication#authenticating-users

This may be useful aswell


1
投票

您应将auth与防护一起使用。

{{ \Auth::guard('api')->user(); }}

0
投票

或者,您可以通过Illuminate \ Http \ Request实例访问经过身份验证的用户。

解释

<?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...
    }
}

检查Documentation


0
投票

虽然调用Auth::guard('api')->user()有效,但是每次尝试访问经过身份验证的用户时,我都不得不设置默认保护,这非常丑陋。

您可以做的是创建一个新的中间件,该中间件为特定路由设置默认防护。

创建一个新的中间件:

<?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,
];

将其应用于您的公共路线:

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

现在,您可以像往常一样访问经过身份验证的用户,例如:

Auth::user();
$request->user();
etc.
© www.soinside.com 2019 - 2024. All rights reserved.