Laravel sanctum 多身份认证(multi auth)

2021-06-07 12:40:27   Laravel

Laravel sanctum是一个相对于oath2更为轻量级的身份认证,但是并不能像laravel auth一样多角色认证,所以,我们需要稍作改动,以满足多身份认证场景

关于基本使用见 如何使用Laravel sanctum

安装和配置sanctum后,就可以开始搞事情了。

核心思想

Sanctum 可以为令牌分配 “abilities”,类似于 OAuth 的 “scopes”,其实我们可以用这个“abilities”或者说“scopes”的功能,再借助一下中间件,来实现多身份认证的操作。

模型

假设我们有两个用户模型 useradmin,分别是普通用户和管理员,大概是这样

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:userrole:admin,这将在后面可用去区别不同身份。

中间件

这时候,我们需要写2个中间件来处理不同身份用户的认证了。

php artisan make:middleware UserRoleAuthMiddleware
php artisan make:middleware AdminRoleAuthMiddleware

User验证中间件

class UserRoleAuthMiddleware
{
    public function handle($request, Closure $next)
    {
        if (auth()->user()->tokenCan('role:user')) {
            return $next($request);
        }
        return response()->json('Not Authorized', 401);
    }
}

Admin验证中间件

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:userrole: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
欢迎小伙伴们在下方评论区留言 ~ O(∩_∩)O
文章对我有帮助, 点此请博主吃包辣条 ~ O(∩_∩)O

猜你喜欢


评论

There are no comments yet.
未登录

登录后即可发表评论

登录或注册

标签

AdSense Anaconda Android apache API apt Auth AWS B-tree Bandwagon Blog bower brew bytes Caffe Catalina cloudcone Composer conda CoreML CPU crontab CSS csv Cuda cv2 datetime Digitalocean DNS Docker Docker-Compose Eloquent Excel export Flask FTP GET Git GitHub GitLab Gmail GoDaddy Google GTM hash Homebrew Homestead HTML http HTTPS IDEA image imagemagick imagick imgick import InnoDB ios iou iPhone ISO8601 iTerm2 Java JPG Keras Laravel Laravel-Admin lazyload Linux list lnmp load logs Lravel Mac Markdown matplotlib md5 mix MobileNet Mojave mongo MongoDB MySQL Namesilo Nginx Node npm numpy Nvidia Nvidia-Docker onevps OpenCV Openpose openpyxl Outline parse PayPal PHP php-fpm PhpStorm PHP扩展 PIL Pillow pip PNG POST Protobuf PyCharm pyenv pymongo Python Python,人工智能,机器学习,VOC,xml Queue Redis requests RGB Sanctum save selenium SEO Shadowsock Shadowsocks ShadowsocksR simplemde Spring Boot SQLServer ssd SSH SSL证书 SSR str Sublime sudo swap Swift Tensorflow TensorflowLite Terminal Terminator Ubuntu urllib UTC v2ray Valet Validation Validator VienBlog virtualenvs VPN VPS Vultr Web Windows WordPress Xcode xlsx yaml YAPI YUV zip zmq zsh 下载图片 主从同步 云主机 云服务器 人工智能 优化 优惠码 伪原创 作弊与反作弊 免费ss账号 免费提现 切片 前端 加密 协议 博客 友链 双击事件 后台运行 后端 命令 国内镜像源 图标 图片操作 图片转换 域名 多身份认证 大小写转换 姿态检测 安卓模拟器 安装 定时任务 定时执行 密码 密钥 导出导入 小程序码 延迟加载 微信 微信小程序 快捷方式 慢查询 懒加载 提现 搜索引擎 搬瓦工 搭梯子 教程 数据库 数据重复 文件上传 无法登录 日志 日期 时区 时间 时间戳 服务器 机器学习 权限 梯子 模拟浏览器 港版支付宝 漏洞 爬虫 生活服务 用户管理 病毒 登录 目标检测 科学上网 系统升级 索引 组件开发 编辑器 自动付款 自定义组件 英文伪原创 计划任务 计算机视觉 认证 语法 读写分离 远程连接 配置文件 重定向 错误异常 错误提示 队列 阿里云 香港 香港手机号
亲情非友情链接