前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >视频系列 | Casbin权限实战:RESTful及中间件使用

视频系列 | Casbin权限实战:RESTful及中间件使用

作者头像
Tinywan
发布2020-11-05 11:10:44
1.8K0
发布2020-11-05 11:10:44
举报
文章被收录于专栏:开源技术小栈开源技术小栈

RESTful及中间件使用

1、RESTful 是什么?

RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。RESTFUL适用于移动互联网厂商作为业务使能接口的场景,实现第三方OTT调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源。

建议阅读

  1. 维基百科
  2. 阮老师 RESTful API 设计指南

2、RESTful Model

(1)keymatch2 模型

  1. 支持的Models
  2. Golang Models的源码
代码语言:javascript
复制
[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

[policy_effect]
e = some(where (p.eft == allow))

[matchers]
m = r.sub == p.sub && keyMatch2(r.obj, p.obj) && regexMatch(r.act, p.act)

为什么这里要选择 keyMatch2 而不是 keyMatch1?

(2)keyMatch 和 keyMatch2 的区别是啥?

Matchers中的函数

  • 1、keyMatch 案例模型
  • 2、keyMatch2 案例模型

(3)二者的区别

  • (1)keyMatch:能够支持使用*匹配进行匹配匹配,eg:/api/projects/
  • (2)keyMatch2:能够支持*号匹配和/:resource的模式,eg:/api/projects/:id

小结:keyMatch2 更符合复杂的 RESTful

3、Postman 测试

(1)测试说明

通过用户名(user_id)请求casbin定义的策略是否有权限访问

  1. 获取项目:/api/projects GET 方式
  2. 创建新项目:/api/projects POST 方式
  3. 删除项目:/api/projects/2020 DELETE 方式

(2)定义路由地址

代码语言:javascript
复制
Route::group('api', function () {
    // 项目管理
    Route::group('projects', function () {
        // 列表
        Route::get('', 'api/Project/getList');
        // 添加
        Route::post('', 'api/Project/add');
        // 删除
        Route::delete(':id', 'api/Project/delete');
    });
})->allowCrossDomain();

(3)添加测试数据

代码语言:javascript
复制
INSERT INTO `casbin_rule` VALUES (1, 'p', 'Tinywan', '/api/projects', 'GET', NULL, NULL, NULL);
INSERT INTO `casbin_rule` VALUES (2, 'p', 'Tinywan', '/api/projects', 'POST', NULL, NULL, NULL);
INSERT INTO `casbin_rule` VALUES (3, 'p', 'Tinywan', '/api/projects/:id', 'DELETE', NULL, NULL, NULL);

(4)开始测试

4、中间件使用

路由添加中间件

代码语言:javascript
复制
Route::group('api', function () {
    // 项目管理
    Route::group('projects', function () {
        // 列表
        Route::get('', 'api/Project/getList');
        // 添加
        Route::post('', 'api/Project/add');
        // 删除
        Route::delete(':id', 'api/Project/delete');
    });
})->middleware(AuthMiddleware::class)->allowCrossDomain();

中间件参考代码

代码语言:javascript
复制
$url = $request->baseUrl();
try {
    $action = $request->method();
    $uid = $request->header('uid');
    if (empty($uid)) {
        return json(['code' => 401, 'message' => '身份为认证,你是假的吧!']);
    }
    Log::warning('[路由参数]:uid=' . $uid . ' url=' . $url . ' action=' . $action);
    if (!Casbin::enforce($uid, $url, $action)) {
        return json(['code' => 403, 'message' => '已认证,但没有权限访问']);
    }
} catch (CasbinException $exception) {
    return json(['code' => 403, 'message' => '授权异常 ' . $exception->getMessage()]);
}
return $next($request);

请求日志

代码语言:javascript
复制
[ warning ] [路由参数]:uid=Tinywan url=/api/projects action=GET

【bilibili视频】ThinkPHP5.1+Casbin权限实战:RESTful及中间件使用

连接地址:https://www.bilibili.com/video/BV1uk4y117up

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-11-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 万少波的播客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • RESTful及中间件使用
    • 1、RESTful 是什么?
      • 2、RESTful Model
        • 3、Postman 测试
          • 4、中间件使用
          • 【bilibili视频】ThinkPHP5.1+Casbin权限实战:RESTful及中间件使用
          • 连接地址:https://www.bilibili.com/video/BV1uk4y117up
          相关产品与服务
          消息队列 TDMQ
          消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档