在Laravel 5.3中与未认证和已认证的用户共享相同的路由

g2ieeal7  于 2023-03-31  发布在  其他
关注(0)|答案(8)|浏览(141)

我有一个路线,我在那里使用认证中间件,它的工作很好。

Route::group(['prefix' => 'v1','middleware' => ['auth:api']], function()
{
  Route::resource('user', 'v1\MyController');
});

问题是,我也希望这个路由可以被未认证的用户访问。使用上面的方法,我得到了一个401 Unauthorized错误,我不能为未认证的用户返回任何内容。那么,我如何认证这个路由(以便它传递用户数据),同时即使用户没有通过认证,也允许路由继续?
(我试着在路由器页面上做一个有条件的Auth检查,但似乎用户已经通过了身份验证,所以它总是假的。)
编辑:我还应该注意到,我正在使用一个API路由与密码授予和访问令牌。

xxslljrj

xxslljrj1#

从当前路由组中删除此路由(应用认证中间件)。
然后

public function __construct()
{
    if (array_key_exists('HTTP_AUTHORIZATION', $_SERVER)) {
        $this->middleware('auth:api');
    }
}

然后

if (Auth::check()) {
    // Auth users
} else{ 
    //Guest users 
}
7tofc5zh

7tofc5zh2#

我正在经历同样的情况。
由于auth中间件只检查经过验证的用户,因此我们可以使用未经过验证的用户的客户端凭证。
客户端凭证具有位于Laravel\Passport\Http\Middleware\CheckClientCredentails中的单独中间件。
我已经创建了一个自定义中间件来合并这两个中间件,以允许任何一个通过。
下面是我定制中间件

namespace Laravel\Passport\Http\Middleware;

use Closure;
use League\OAuth2\Server\ResourceServer;
use Illuminate\Auth\AuthenticationException;
use League\OAuth2\Server\Exception\OAuthServerException;
use Symfony\Bridge\PsrHttpMessage\Factory\DiactorosFactory;

class CheckClientCredentials
{
    /**
     * The Resource Server instance.
     *
     * @var ResourceServer
     */
    private $server;

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

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  \Closure $next
     * @return mixed
     *
     * @throws \Illuminate\Auth\AuthenticationException
     */
    public function handle($request, Closure $next, ...$scopes)
    {
        $psr = (new DiactorosFactory)->createRequest($request);

        try{
            $psr = $this->server->validateAuthenticatedRequest($psr);
        } catch (OAuthServerException $e) {
            throw new AuthenticationException;
        }

        foreach ($scopes as $scope) {
           if (!in_array($scope,$psr->getAttribute('oauth_scopes'))) {
             throw new AuthenticationException;
           }
         }

        return $next($request);
    }
}

Kernal.php

protected $routeMiddleware = [
    'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
    'auth.api' => \App\Http\Middleware\APIAuthenticate::class,
    ....

routes\api.php

Route::group([
    'namespace' => 'API',
    'middleware' => 'auth.api:api',
], function(){
    ....
fhg3lkii

fhg3lkii3#

在一个未经身份验证的(未分配auth:API中间件)路由的处理程序方法中,尝试:
Auth::guard("api")->user();
如果它被填充了,那么你的无防护路由就可以将访问视为经过身份验证的。如果没有,它是一个随机的用户访问路由,可以被这样对待。

pb3skfrl

pb3skfrl4#

不要把那些你想同时允许访客用户和认证用户访问的网址放在认证中间件中,因为认证中间件只允许认证用户访问。
要检查已验证和未验证的用户,可以在视图中使用以下代码

@if (Auth::guest())
      //For guest users
 @else
      //for authenticated users
 @endif

编辑:在控制器使用中

if (Auth::check()) {
    // Auth users
} else{ 
  //Guest users 
}
0wi1tuuw

0wi1tuuw5#

@Yves的答案几乎是正确的。但是一个小的变化,
代替array_key_exists,我们需要检查key value是否不为null。因为它总是有那个键,但值为null。所以,代替控制器构造这样的授权头检查。

if ($_SERVER['HTTP_AUTHORIZATION']) {
    $this->middleware('auth:sanctum');
}

然后,您可以像这样检查经过身份验证的用户:

if (auth()->check()) {
    // User is logged in and you can access using
    // auth()->user()
} else {
    // Unauthenticated
}
vnjpjtjt

vnjpjtjt6#

供圣所用途:

if (Auth::guard('sanctum')->check()) {
        // user is logged in
        /** @var User $user */ $user = Auth::guard('sanctum')->user();
    } else {
        // user is not logged in (no auth or invalid token)
    }
z9zf31ra

z9zf31ra7#

我已经用另一种方法解决了我的问题。从中间件组中删除路由,并在控制器的构造中检查用户是否经过身份验证,如果经过身份验证,您可以为该会话传播经过身份验证的用户。在我的场景中,我确实需要检查用户是否在API JsonResource中经过身份验证。

class PostController extends Controller
{
    public function __construct()
    {
        if (Auth::guard('api')->user()) {
            //propagate user in the current session
            $this->middleware('auth:api', [
                'only' => [
                    'index'
                 ]
            ]);
        }
    }
}
fhity93d

fhity93d8#

您可以使用以下示例:

@if(Auth::user())
   echo "authincatesd user";
@else
   echo "unauthorised";
 @endif

相关问题