问题
问题 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 范围来解决这种情况。
定义范围
您可以使用 AuthServiceProvider
的 boot
方法中的 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/