首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用警卫的Laravel护照多重认证

使用警卫的Laravel护照多重认证
EN

Stack Overflow用户
提问于 2018-10-17 09:10:59
回答 3查看 14.5K关注 0票数 9

我们是否可以使用不同守卫的laravel护照来验证两种不同类型的用户的API。例如,我们为驱动程序用户提供了驱动程序,为供应商用户提供了供应商应用程序。两者都有不同的车型司机和供应商。我们如何使用不同的警卫来使用Laravel验证这两种类型的用户?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-08-06 15:45:44

通过使用简单的中间件,我成功地创建了多个作者(使用laravel/护照)。

步骤1: config/auth.php

将用户类添加到提供程序

代码语言:javascript
复制
'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'passport',
        'provider' => 'basic_users', // default
    ],        
],

...

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],
    'admin_users' => [
        'driver' => 'eloquent',
        'model' => App\AdminUser::class,
    ],
    'basic_users' => [
        'driver' => 'eloquent',
        'model' => App\BasicUser::class,
    ],
],

通过CLI清理缓存

代码语言:javascript
复制
php artisan config:cache

步骤2:创建中间件

代码语言:javascript
复制
php artisan make:middleware AdminUserProvider

在app/Http/中间件中打开新创建的中间件,并更新手动方法如下所示

代码语言:javascript
复制
public function handle($request, Closure $next)
{
    config(['auth.guards.api.provider' => 'admin_users']);
    return $next($request);
}

步骤3:注册中间件

将新创建的中间件添加到$routeMiddleware

代码语言:javascript
复制
protected $routeMiddleware = [
    ...
    'auth.admin' => \App\Http\Middleware\AdminUserProvider::class,
];

确保它在$middlewarePriority的顶端

代码语言:javascript
复制
protected $middlewarePriority = [
    \App\Http\Middleware\AdminUserProvider::class,
    ...
];

步骤4:向路由添加中间件

代码语言:javascript
复制
Route::group(['middleware' => ['auth.admin','auth:api']], function() {

步骤5: LoginControllers (AdminUserController & BasicUserController)

代码语言:javascript
复制
public function login()
{
    $validatedData = request()->validate([
        'email' => 'required',
        'password' => 'required|min:6'
    ]);
    // get user object
    $user = AdminUser::where('email', request()->email)->first();
    // do the passwords match?
    if (!Hash::check(request()->password, $user->password)) {
        // no they don't
        return response()->json(['error' => 'Unauthorized'], 401);
    }
    // log the user in (needed for future requests)
    Auth::login($user);
    // get new token
    $tokenResult = $user->createToken($this->tokenName);
    // return token in json response
    return response()->json(['success' => ['token' => $tokenResult->accessToken]], 200);
}

总结如下:

登录控制器使用雄辩的模型来获取用户对象,然后通过Auth::$user登录用户。

然后,对于需要身份验证的未来请求,新的中间件将把api auth保护提供程序更改为正确的类。

票数 9
EN

Stack Overflow用户

发布于 2020-08-26 16:17:04

经过一段时间之后,我发现在、Laravel 7、中,除了一些配置之外,不需要定制代码。有关详细信息,请查看我在项目多个8月与Laravel 5.4和护照中测试和实现的答案。

票数 0
EN

Stack Overflow用户

发布于 2020-11-23 10:54:22

您不一定需要更改每个请求的配置。每个警卫都需要一个客户。在创建客户端之后,运行

代码语言:javascript
复制
passport:install

确保在数据库中指定了提供程序字段。它应该与auth.providers配置值相同。

在创建客户端和保护程序之后,在创建访问令牌时使用以下代码。

代码语言:javascript
复制
App::clearResolvedInstance(ClientRepository::class);
app()->singleton(ClientRepository::class, function () {
    return new ClientRepository(User::CLIENT_ID, null); // Client id of the model
});

确保在oauth_clients表中指定了提供程序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52851208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档