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 AdminRoleAuthMiddlewareclass 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版权所有,允许转载,但转载请注明出处和原文链接: http://45.76.225.121/article/299