Laravel Sanctum多重防护/中间件

zpgglvta  于 2022-11-26  发布在  其他
关注(0)|答案(2)|浏览(204)

我正在使用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);
}

我可以这样用

// routes/api.php
Route::group(['middleware' => ['auth:sanctum']], function() {
 //
});

但我真正想用的是

// routes/api.php
Route::group(['middleware' => ['admin:sanctum']], function() {
 //
});

我试过了

// config/sanctum.php 
  'guard' => ['web', 'admin'],

我还定义了海关守卫

// config/auth.php
    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
        'admin' => [
           'driver' => 'session', // provider admin also defined and $table = 'admin' not admins
           'provider' => 'admin',
       ],
    ],

顺便说一下,当我试图改变驱动程序像这样的驱动程序=〉sanctum php工匠服务器:8000退出.

e0bqpujr

e0bqpujr1#

我在探索拉拉威尔8号和圣域时遇到了类似的问题。我能够使用拉拉威尔圣域提供的令牌能力中间件使其工作。
下面是我认为它可以为你工作的方式。
在控制器中,创建令牌时将角色作为能力传递

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);
}

然后,您可以使用令牌能力中间件来标识用户角色

// routes/api.php
Route::group(['middleware' => ['auth:sanctum','ability:admin']], function() {
 //
});

// routes/api.php
Route::group(['middleware' => ['auth:sanctum','abilities:admin']], function() {
 //
});

同样,您可以为您得用户角色创建权能.
当然,您必须将以下内容添加到app/Http/Kernel.php中的$routeMiddleare中,才能使上述解决方案正常工作

'ability' => \Laravel\Sanctum\Http\Middleware\CheckForAnyAbility::class,
'abilities' => \Laravel\Sanctum\Http\Middleware\CheckAbilities::class,

你可以在官方文档中了解更多关于这个的信息

q35jwt9p

q35jwt9p2#

你的问题很容易用Laravel Spatie解决。看看这个https://spatie.be/docs/laravel-permission/v5/introduction。你可以创建角色和权限,并在你的路线中使用CAN来沿着组或单个路线分配访问。

相关问题