php - 持护照的多用户 - 如何获取经过身份验证的用户类型

标签 php laravel oauth-2.0 laravel-passport laravel-5.8

问题

问题 1:如果用户提交事件 token ,则该 token 无法识别用户类型,无论中间件如何,它始终接受。

示例:用户 token 可以访问管理 Controller

Route::apiResource('admins', 'AdministratorController')->middleware('auth: admin');

问题 2: 从 Controller 获取的模型始终是放置在路由中的最后一个身份验证中间件。

示例:基于我的 api.php用户 Controller 获取管理模型,并且如果我更改位置 我将获得用户模型

问题 3:我注意到,如果 token 处于事件状态,它会获取中间件类类型 id,即如果我使用 administrator token 并且中间件为 user 它将从表 Users 中获取管理员 ID。

示例:

/** 
 * If I set Auth:user and send a active admin token
 * I will receive the student model with the same admin id
 */
Route::get('/users', function(Request $request) {
    return auth()->guard('user')->user();
});

代码

Auth.php

'user' => [
    'driver' => 'passport',
    'provider' => 'users',
],
'admin' => [
    'driver' => 'passport',
    'provider' => 'admins',
],

API.php

Route::group(['middleware' => ['auth:user', 'auth:admin']], function() {
    Route::apiResource('users', 'UserController')->only([
        'index', 'show', 'update'
    ]);
});

UserController.php

public function index(Request $request)
{
    return \Auth::user();
}

最佳答案

我的建议是,改变你的方法。

Passport 使用 token 范围来解决这种情况。

定义范围

您可以使用 AuthServiceProviderboot 方法中的 Passport::tokensCan 方法定义 API 范围。

use Laravel\Passport\Passport;

Passport::tokensCan([
    'place-orders' => 'Place orders',
    'check-status' => 'Check order status',
]);

检查范围

Passport 包括两个中间件,可用于验证传入请求是否已使用已授予给定范围的 token 进行身份验证。

首先,请将以下中间件添加到 app/Http/Kernel.php$routeMiddleware 属性中

'scopes' => \Laravel\Passport\Http\Middleware\CheckScopes::class,
'scope' => \Laravel\Passport\Http\Middleware\CheckForAnyScope::class,

检查所有范围

scopes 中间件可以分配给一个路由,以验证传入请求的访问 token 是否具有所有列出的范围:

Route::get('/orders', function () {
    // Access token has both "check-status" and "place-orders" scopes...
})->middleware('scopes:check-status,place-orders');

检查任何范围

范围中间件可以分配给一个路由,以验证传入请求的访问 token 是否至少具有列出的范围之一:

Route::get('/orders', function () {
    // Access token has either "check-status" or "place-orders" scope...
})->middleware('scope:check-status,place-orders');

完整引用: Token Scopes

关于php - 持护照的多用户 - 如何获取经过身份验证的用户类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57484680/

相关文章:

java - Spring OAuth2 授权服务器替代方案

javascript - iOS 8 在 OAuth 的 401 上显示基本身份验证的弹出窗口

php - 如何在 woocommerce 中获取所有订单详细信息,包括付款客户产品和运输详细信息

php - 从 "query"导出 "mysqli->prepare"

php - 上传后将3张图片存入数据库

javascript - 在 Laravel 5.3 中使用 Javascript 中的 Foreach 循环

perl - Mojolicious 应用程序使用谷歌身份验证,插件 OAuth2

php - 搜索并替换目录中的文件

php - Postgresql 的 Mysql(Group By) 替代品?

php - 即使我在 laravel api 中获取不同的内容,也会从数据库中获取错误的数据