专栏首页Web技术研发视频系列 | Casbin权限实战:RESTful及中间件使用

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

RESTful及中间件使用

1、RESTful 是什么?

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

建议阅读

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

2、RESTful Model

(1)keymatch2 模型

  1. 支持的Models
  2. Golang Models的源码
[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)定义路由地址

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)添加测试数据

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、中间件使用

路由添加中间件

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

中间件参考代码

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

请求日志

[ warning ] [路由参数]:uid=Tinywan url=/api/projects action=GET

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

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

本文分享自微信公众号 - 万少波的播客(Tinywanblog),作者:Tinywan

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-11-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 视频系列 | Casbin权限实战:入门分享

    Casbin是一个强大的、高效的开源访问控制框架,其权限管理机制支持多种访问控制模型。

    Tinywan
  • 视频系列 | Casbin权限实战:基于角色的RBAC授权

    身份验证是关于验证您的凭据,如用户名/用户ID和密码,以验证您的身份。系统确定您是否就是您所说的使用凭据。在公共和专用网络中,系统通过登录密码验证用户身份。身份...

    Tinywan
  • Go 语言入门练手项目推荐

    大家好,我是 roseduan,经常看到一些小伙伴学习完 Go 语言的基础知识之后,无法找到合适的练手项目,然后就很迷茫。

    roseduan
  • 基于Casbin的Docker权限管理访问控制插件

    Docker是目前主流的一种容器技术。为了解决多用户同时访问Docker时产生的安全问题,Docker设计了访问控制插件(Authorization Plugi...

    FB客服
  • go-admin-基于Gin + Vue + Element UI的前后端分离权限管理系统

    系统初始化极度简单,只需要配置文件中,修改数据库连接,系统启动后会自动初始化数据库信息以及必须的基础数据

    ccf19881030
  • [Go] Golang练习项目-web客服系统即时通讯websocket项目go-fly

    10.充分实践了struct,interface,map,slice,for range,groutine和channel管道等基础知识

    陶士涵
  • 使用casbin完成验证授权

    上一篇讲了搭建一个身份认证系统,可以看到借助dex搭建一个安全可靠的身份认证系统并不是太难。本篇再讲一下用casbin完成验证授权。

    jeremyxu
  • 使用casbin完成验证授权.md

    上一篇讲了搭建一个身份认证系统,可以看到借助dex搭建一个安全可靠的身份认证系统并不是太难。本篇再讲一下用casbin完成验证授权。

    jeremyxu
  • Gin集成Casbin进行访问权限控制

    Casbin是一个强大的、高效的开源访问控制框架,其权限管理机制支持多种访问控制模型,Casbin只负责访问控制[1]。

    没有故事的陈师傅
  • [Rust][权限控制][Casbin] Rust 下成熟好用的权限控制库

    Casbin是基于 Go 语言的权限控制库。它支持 ACL, RBAC, ABAC 等常用的访问控制模型。

    MikeLoveRust
  • 从别人的代码中学习golang系列--03

    这篇博客还是整理从https://github.com/LyricTian/gin-admin 这个项目中学习的golang相关知识。

    coders
  • Go之Casbin简介,安装,模型,存储,函数

    Casbin是一个强大的,高效的开源访问控制框架,其权限管理机制支持多种访问控制模型

    常见_youmen
  • Go 每日一库之 casbin

    权限管理在几乎每个系统中都是必备的模块。如果项目开发每次都要实现一次权限管理,无疑会浪费开发时间,增加开发成本。因此,casbin库出现了。casbin是一个强...

    用户7731323
  • beego利用casbin进行权限管理——第四节 策略更新

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/det...

    hotqin888
  • Go优秀开源项目推荐

      本文主要是收集Go语言开发的一些优秀项目和框架,个人见识有限肯定还有很多优秀的项目没有收录的,假如大家有好的Go项目可以在文末留言。

    追逐时光者
  • 支持MACRBACABAC多种模型的Golang访问控制框架 – casbin

    casbin casbin是一个用Go语言打造的轻量级开源访问控制框架(https://github.com/hsluoyz/casbin),目前在GitHub...

    FB客服
  • 这个权限开源项目,真牛逼!【附源码】

    权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源,不多不少。权限管理几乎出现在任何系统里面,只要有用户和密码的系统。

    用户5224393
  • 高效、简单、方便管理与维护的开源运维工单系统

    ferry工单系统是一个集工单统计、任务钩子、RBAC权限管理、灵活配置流程与模版于一身的开源工单系统,当然也可以称之为工作流引擎。

    用户6784452
  • Django-rest-framework 是个什么鬼?

    其实,基于 django-rest-framework 的 RESTful API 的开发,过程是完全类似的:

    HelloGitHub

扫码关注云+社区

领取腾讯云代金券