Laravel sanctum是一个相对于oath2更为轻量级的身份认证,但是并不能像laravel auth一样多角色认证,所以,我们需要稍作改动,以满足多身份认证场景
关于基本使用见 如何使用Laravel sanctum
安装和配置sanctum后,就可以开始搞事情了。
Sanctum 可以为令牌分配 “abilities”,类似于 OAuth 的 “scopes”,其实我们可以用这个“abilities”或者说“scopes”的功能,再借助一下中间件,来实现多身份认证的操作。
假设我们有两个用户模型 user
和 admin
,分别是普通用户和管理员,大概是这样
class User extends Authenticatable
{
use HasApiTokens;
}
class Admin extends Authenticatable
{
use HasApiTokens;
}
这时候,我们创建一个用于登录的controller
php artisan make:controller Api/AuthController
写一下两个登录
public function userLogin(Request $request)
{
// 这里为了演示就不写登录逻辑了
$user = User::query()->find(1);
return response()->json([
'token' => $user->createToken('test', ['role:user'])->plainTextToken
]);
}
public function adminLogin(Request $request)
{
$admin = Admin::query()->find(1);
return response()->json([
'token' => $admin->createToken('test', ['role:admin'])->plainTextToken
]);
}
可以看到,上面两个登录其实不同的点主要是在于createToken
中第二个参数 role:user
和 role:admin
,这将在后面可用去区别不同身份。
这时候,我们需要写2个中间件来处理不同身份用户的认证了。
php artisan make:middleware UserRoleAuthMiddleware
php artisan make:middleware AdminRoleAuthMiddleware
class UserRoleAuthMiddleware
{
public function handle($request, Closure $next)
{
if (auth()->user()->tokenCan('role:user')) {
return $next($request);
}
return response()->json('Not Authorized', 401);
}
}
class AdminRoleAuthMiddleware
{
public function handle($request, Closure $next)
{
if (auth()->user()->tokenCan('role:admin')) {
return $next($request);
}
return response()->json('Not Authorized', 401);
}
}
可以看到,tokenCan
函数分别通过 role:user
和 role:admin
,来验明身份,若非正确身份的token,即使有效也是一样要被拒之门外的。
找到Kernal.php
,在最后 $routeMiddleware
数组末尾,添加上我们刚刚创建的中间件
'auth.role.user' => CustomerMiddleware::class,
'auth.role.admin' => DriverMiddleware::class,
// user用户
Route::middleware(['auth:sanctum', 'auth.role.user'])->group(function () {
Route::get('/demos', 'Api\Users\DemoController@index');
});
// admin用户
Route::middleware(['auth:sanctum', auth.role.admin'])->group(function () {
Route::get('/demos', 'Api\Admins\DemoController@index');
});
如此这般,便大功告成了。
viencoding.com版权所有,允许转载,但转载请注明出处和原文链接: https://viencoding.com/article/299