在 laravel 8 中创建 auth guard 使用中间件

Posted

技术标签:

【中文标题】在 laravel 8 中创建 auth guard 使用中间件【英文标题】:Create auth guard use middleware in laravel 8 【发布时间】:2021-06-11 16:40:51 【问题描述】:

我想创建一个新的守卫,它将用于为用户创建 api,我期望的是中间件(auth:u-api),但它不起作用,只是再次重定向到登录仪表板不会显示 json

如何在不添加 (auth: api) 的情况下向所有用户显示这样的内容


    id: 1,
    role_id: "1",
    username: "adminuser",
    email: "admin@gmail.com",
    email_verified_at: "2021-02-22T06:02:02.000000Z",
    created_at: "2021-02-19T02:42:08.000000Z",
    updated_at: "2021-02-22T06:02:02.000000Z",
    logged_at: "2021-03-03T20:21:33.000000Z"

路由/api.php

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

Providers/RouteServiceProvider.php

    public function boot()
    
        $this->configureRateLimiting();

        $this->routes(function () 
            Route::prefix('api')
                ->middleware('api')
                ->namespace($this->namespace)
                ->group(base_path('routes/api.php'));

            Route::prefix('u-api') // User API
                ->middleware('u-api')
                ->namespace($this->namespace)
                ->group(base_path('routes/api.php'));

            Route::middleware('web')
                ->namespace($this->namespace)
                ->group(base_path('routes/web.php'));
        );
    

配置/auth.php

'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'api' => [
            'driver' => 'sanctum',
            'provider' => 'users',
            'hash' => false,
        ],

        'u-api' => [ // User API
            'driver' => 'session',
            'provider' => 'users',
        ],
    ],

app/Http/Kernel.php

class Kernel extends HttpKernel

    protected $middleware = [
        // \App\Http\Middleware\TrustHosts::class,
        \App\Http\Middleware\TrustProxies::class,
        \Fruitcake\Cors\HandleCors::class,
        \App\Http\Middleware\PreventRequestsDuringMaintenance::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    ];

    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

        'api' => [
            \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
            'throttle:api',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

        'u-api' => [ // User API
            \App\Http\Middleware\EncryptCookies::class,     
            \Illuminate\Session\Middleware\StartSession::class,
            'throttle:api',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ]
    ];

    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
        'role' => \App\Http\Middleware\CheckRole::class,
    ];


【问题讨论】:

对不起,评论与帖子无关,您是如何录制屏幕并将其转换为 gif 的? :-) @AliShakiba 我使用 ScreenToGif 【参考方案1】:

如果您想要一个无需身份验证的 API,您可以执行以下操作:

Route::get('/halo', function() 
    return User::all();
);

但是,任何人都可以枚举所有用户数据。

所以我会添加某种形式的身份验证 + 授权,只是为了让这些详细信息只有特定用户才能访问。

在最简单的形式中,它看起来像这样:

Route::middleware('auth:api')->get('/halo', function() 
    if (Auth::user()->id !== 1) abort(403);
    return User::all();
);

您也可以使用spatie/laravel-permission 来采用基于角色的方法 这将更加灵活。

【讨论】:

但是我想为第三方制作(auth:api),同时为使用这个应用程序的用户制作(auth:u-api)。我想把这两个中间件分开,我该怎么做? 只要您通过会话登录,您也可以使用authu-api 中间件。但是拥有一个单独的中间件并不能真正保证只有某些用户可以访问。所以我会采用基于角色的方法。顺便说一句,由于您使用的是u-api 的会话驱动程序,它仍然是一个网络路由。 是的 u-api 我故意像 web 一样使用会话,问题是使用 (auth: u-api) 时它重定向到仪表板而不是显示用户数据 也许你有冲突的路线定义?顺便说一句,我的意思是您可以交替使用webu-api,因为除了名称之外没有其他区别。如果您正在寻找单独的身份验证保护结帐:pusher.com/tutorials/multiple-authentication-guards-laravel

以上是关于在 laravel 8 中创建 auth guard 使用中间件的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Rest API Google Auth 在 Angular

如何在 Laravel 5.2 中创建多重身份验证

在 Laravel-8 项目中创建数据不起作用,如何解决?

如何使用单个工匠命令在 Laravel 8 中创建多个模型?

我们如何在 Laravel 8.1 中创建一个普通控制器(--plain 在新版本中不存在)[关闭]

如何使用 Laravel 8 中的工厂在 tinker 中创建虚拟表数据并连接它们?