我正在使用 Laravel Sanctum 和 Vuejs。我想分别以管理员和用户身份登录,当然他们的请求不应该互相到达。
我有用户(模型和控制器)和管理员(模型和控制器)
这就是我登录的方式(两个控制器分别像这样)
public function login(Request $request) {
$fields = $request->validate([
'username' => 'required|string',
'password' => 'required|string',
]);
$admin = Admin::where('username', $fields['username'])->first();
if (!$admin || !Hash::check($fields['password'], $admin['password'])) {
return response([
'error' => 'some error'
]);
}
$token = $admin->createToken($request['username'])->plainTextToken;
$response = [
'admin' => $admin,
'admin_token' => $token
];
return response($response, 201);
}
Run Code Online (Sandbox Code Playgroud)
我可以这样使用
// routes/api.php
Route::group(['middleware' => ['auth:sanctum']], function() {
//
});
Run Code Online (Sandbox Code Playgroud)
但我真正想这样使用
// routes/api.php
Route::group(['middleware' => ['admin:sanctum']], function() {
//
});
Run Code Online (Sandbox Code Playgroud)
我试过
// config/sanctum.php
'guard' => ['web', 'admin'],
Run Code Online (Sandbox Code Playgroud)
我还定义了自定义守卫
// config/auth.php
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'admin' => [
'driver' => 'session', // provider admin also defined and $table = 'admin' not admins
'provider' => 'admin',
],
],
Run Code Online (Sandbox Code Playgroud)
顺便说一句,当我尝试更改像这样的驱动程序时,驱动程序 => sainttum php artisan server:8000 退出了。
小智 5
我在探索 Laravel 8 和 Sanctum 时遇到了类似的问题。我能够使用 Laravel Sanctum 提供的令牌能力中间件使其工作。
我认为这对你有用。
在您的控制器中,在创建令牌时将角色作为能力传递
public function login(Request $request) {
$fields = $request->validate([
'username' => 'required|string',
'password' => 'required|string',
]);
$admin = Admin::where('username', $fields['username'])->first();
if (!$admin || !Hash::check($fields['password'], $admin['password'])) {
return response([
'error' => 'some error'
]);
}
$token = $admin->createToken($request['username'], ['admin'])->plainTextToken;
$response = [
'admin' => $admin,
'admin_token' => $token
];
return response($response, 201);
}
Run Code Online (Sandbox Code Playgroud)
然后就可以使用TokenAbility中间件来识别用户角色
// routes/api.php
Route::group(['middleware' => ['auth:sanctum','ability:admin']], function() {
//
});
Run Code Online (Sandbox Code Playgroud)
或者
// routes/api.php
Route::group(['middleware' => ['auth:sanctum','abilities:admin']], function() {
//
});
Run Code Online (Sandbox Code Playgroud)
同样,您可以为您的用户角色创建能力。
当然,您必须将以下内容添加到 app/Http/Kernel.php 中的 $routeMiddleare 中才能使上述解决方案起作用
'ability' => \Laravel\Sanctum\Http\Middleware\CheckForAnyAbility::class,
'abilities' => \Laravel\Sanctum\Http\Middleware\CheckAbilities::class,
Run Code Online (Sandbox Code Playgroud)
您可以在官方文档Laravel Sanctum Token Abilities中了解更多相关信息