Php 拉雷维尔圣所海关警卫

Php 拉雷维尔圣所海关警卫,php,laravel,Php,Laravel,我的laravel应用程序中有多个守卫: Codeconfig/auth.php: 'defaults' => [ 'guard' => 'user', 'passwords' => 'users', ], 'guards' => [ 'user' => [ 'driver' => 'token', 'provider' => 'users', 'hash' => true,

我的laravel应用程序中有多个守卫:

Codeconfig/auth.php

'defaults' => [
    'guard' => 'user',
    'passwords' => 'users',
],

'guards' => [
    'user' => [
        'driver' => 'token',
        'provider' => 'users',
        'hash' => true,
    ],
    'admin' => [
        'driver' => 'token',
        'provider' => 'admins',
        'hash' => true,
    ]
],

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => User::class,
    ],
    'admins' => [
        'driver' => 'eloquent',
        'model' => Admin::class,
    ],
],

'passwords' => [
    'users' => [
        'provider' => 'users',
        'table' => 'users_password_resets',
        'expire' => 60,
        'throttle' => 60,
    ],
    'admins' => [
        'provider' => 'admins',
        'table' => 'admins_password_resets',
        'expire' => 60,
        'throttle' => 60,
    ],
],

'password_timeout' => 10800,
Route::get('admins/auth/user', 'AuthController@user')->middleware('auth:sanctum');
'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', 'localhost,127.0.0.1')),

'expiration' => null,

'middleware' => [
    'verify_csrf_token' => App\Http\Middleware\VerifyCsrfToken::class,
    'encrypt_cookies' => App\Http\Middleware\EncryptCookies::class,
],

// This line added
'guard' => 'admin'
并且在
api.php
中有获取身份验证用户的路径:

'defaults' => [
    'guard' => 'user',
    'passwords' => 'users',
],

'guards' => [
    'user' => [
        'driver' => 'token',
        'provider' => 'users',
        'hash' => true,
    ],
    'admin' => [
        'driver' => 'token',
        'provider' => 'admins',
        'hash' => true,
    ]
],

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => User::class,
    ],
    'admins' => [
        'driver' => 'eloquent',
        'model' => Admin::class,
    ],
],

'passwords' => [
    'users' => [
        'provider' => 'users',
        'table' => 'users_password_resets',
        'expire' => 60,
        'throttle' => 60,
    ],
    'admins' => [
        'provider' => 'admins',
        'table' => 'admins_password_resets',
        'expire' => 60,
        'throttle' => 60,
    ],
],

'password_timeout' => 10800,
Route::get('admins/auth/user', 'AuthController@user')->middleware('auth:sanctum');
'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', 'localhost,127.0.0.1')),

'expiration' => null,

'middleware' => [
    'verify_csrf_token' => App\Http\Middleware\VerifyCsrfToken::class,
    'encrypt_cookies' => App\Http\Middleware\EncryptCookies::class,
],

// This line added
'guard' => 'admin'
在我的模型(管理员、用户)中也使用了trait:

Laravel\Sanctum\HasApiTokens

当我尝试通过令牌获取身份验证用户时,获取错误消息:

InvalidArgumentException: Auth guard [web] is not defined. in file appname\vendor\laravel\framework\src\Illuminate\Auth\AuthManager.php on line 84

#0 appname\vendor\laravel\framework\src\Illuminate\Auth\AuthManager.php(68): Illuminate\Auth\AuthManager->resolve()
#1 appname\vendor\laravel\sanctum\src\Guard.php(45): Illuminate\Auth\AuthManager->guard()
#2 [internal function]: Laravel\Sanctum\Guard->__invoke()
#3 appname\vendor\laravel\framework\src\Illuminate\Auth\RequestGuard.php(58): call_user_func()
#4 appname\vendor\laravel\framework\src\Illuminate\Auth\GuardHelpers.php(60): Illuminate\Auth\RequestGuard->user()
#5 appname\vendor\laravel\framework\src\Illuminate\Auth\Middleware\Authenticate.php(63): Illuminate\Auth\RequestGuard->check()
#6 appname\vendor\laravel\framework\src\Illuminate\Auth\Middleware\Authenticate.php(42): Illuminate\Auth\Middleware\Authenticate->authenticate()
我已经运行了以下命令:

php artisan cache:clear
php artisan config:cache
还尝试将保护名称添加到
config/sanctum.php

'defaults' => [
    'guard' => 'user',
    'passwords' => 'users',
],

'guards' => [
    'user' => [
        'driver' => 'token',
        'provider' => 'users',
        'hash' => true,
    ],
    'admin' => [
        'driver' => 'token',
        'provider' => 'admins',
        'hash' => true,
    ]
],

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => User::class,
    ],
    'admins' => [
        'driver' => 'eloquent',
        'model' => Admin::class,
    ],
],

'passwords' => [
    'users' => [
        'provider' => 'users',
        'table' => 'users_password_resets',
        'expire' => 60,
        'throttle' => 60,
    ],
    'admins' => [
        'provider' => 'admins',
        'table' => 'admins_password_resets',
        'expire' => 60,
        'throttle' => 60,
    ],
],

'password_timeout' => 10800,
Route::get('admins/auth/user', 'AuthController@user')->middleware('auth:sanctum');
'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', 'localhost,127.0.0.1')),

'expiration' => null,

'middleware' => [
    'verify_csrf_token' => App\Http\Middleware\VerifyCsrfToken::class,
    'encrypt_cookies' => App\Http\Middleware\EncryptCookies::class,
],

// This line added
'guard' => 'admin'

我解决了类似的问题,因为我对用户和管理员用户使用身份验证。 您可以使用sanctum使用中间件('auth:sanctum')使用laravel/ui包对自己进行身份验证,但要使其使用管理模型而不是用户,您必须更改防护。 让我解释一下:sanctum通常是在auth中定义的一个保护,就像“web”和“api”一样,默认情况下auth.guards.sanctum的provider=null。所以我所做的就是定义我自己的守卫:

'providers' => [
'admin' => [
            'driver' => 'sanctum',
            'provider' => 'admins',
        ],
],

'providers' => [
'admins' => [
            'driver' => 'eloquent',
            'model' => App \ Models \ Admin :: class,
        ],
],
您还可以使用中间件(“auth:sanctum”)保护您的路由 这样,您使用的是管理模型,而不是用户模型。 每次调用使用auth:sanctum保护的组内的路由时,此auth.guard将绑定到providers.admins,这将始终验证管理员模型

您将遇到的问题是,当您登录时,您必须定义登录时要使用的防护装置,因为如果您使用laravel/ui包,默认情况下它使用的是防护装置。web,这将关联用户模型,尽管用户模型中有一个用户具有相同的凭据,但当他访问受sanctum保护的路径时,他将使用管理模型验证凭据。 因此,诀窍是,在登录时,强制将防护更改为具有提供者Admin的防护。 在我的例子中,我所做的是创建一个中间件,它所做的是更改guards.web的提供者 创建中间件,我在RouteMiddle软件的kernel.php文件中注册了它,并将其如下所示:

'auth.admin' => \ App \ Http \ Middleware \ AuthenticateGuardAdmin :: class,
中间件包含以下代码行: Config::set('auth.guards.web.provider','admins')

我把它放在这里的中间件:

Route :: middleware ('auth.admin') -> group (function () {
    Auth :: routes (['register' => false]);
    Route :: middleware ('auth: sanctum') -> group (function () {
        Route :: get ('/ home', 'HomeController @ index') -> name ('home');
    });
});
在使用使用laravel/ui包的标准控制器登录时,我已经告诉配置变量,将使用的提供者将是我定义的使用管理模型的提供者。 通过这种方式,登录、身份验证和授权总是通过Admin模型完成的


之后,您甚至可以使用其他身份验证定义和其他模型或相同的默认用户模型创建其他路由组,甚至可以使用API路由或web路由中的sanctum。

对于我来说,在
config/sanctum.php
文件中添加保护解决了我的问题

'guard' => 'admin'
您可以在这里看到sanctum的守卫是如何使用配置的

您还可以根据上面的代码传递一个值数组,因为配置是由
Arr::wrap