当前位置: 首页 > 文档资料 > Casbin 中文文档 >

API 概述

优质
小牛编辑
141浏览
2023-12-01

这个概述只告诉你如何使用Casbin的API,并没有解释Casbin是如何安装和如何工作的。 你可以在这里找到这些教程:Casbin的安装Casbin如何工作。 因此,当你开始阅读本教程时,我们假设你已经完全安装并将Casbin导入你的代码中。

Enforce API

让我们从Casbin的Enforce API开始。 我们将从model.conf加载一个RBAC模型,并从policy.csv加载策略。 你可以在这里学习模型的语法,在本教程中我们将不谈这个问题。 我们假设你能理解下面给出的配置文件。

model.conf

[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

[role_definition]
g = _, _

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

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

policy.csv

p, admin, data1, read
p, admin, data1, write
p, admin, data2, read
p, admin, data2, write
p, alice, data1, read
p, bob, data2, write
g, amber, admin
g, abc, admin

阅读完配置文件后,请阅读以下代码:

// 从文件中加载信息
enforcer, err := casbin.NewEnforcer("./example/model.conf", "./example/policy.csv")
if err != nil {
    log.Fatalf("error, detail: %s", err)
}
ok, err := enforcer.Enforce("alice", "data1", "read")

这段代码从本地文件加载访问控制模型和策略。 函数casbin.NewEnforcer()将返回一个执行者。 它将识别其两个参数为文件路径,并从那里加载文件。 过程中发生的错误被存储在err中。 这段代码使用默认的适配器来加载模型和策略。 当然,你也可以通过使用第三方适配器得到同样的结果。

代码ok, err := enforcer.Enforce("alice", "data1", "read")是为了确认访问权限。 如果alice可以通过read操作访问data1,返回值ok将是true,否则将是false。 在这个例子中,ok的值是true

EnforceEx API

有时你可能想知道哪个政策允许这个请求,所以我们准备了函数EnforceEx()。 你可以像这样使用它:

ok, reason, err := enforcer.EnforceEx("amber", "data1", "read")
fmt.Println(ok, reason) // true [admin data1 read]

函数EnforceEx()将在返回值reason中返回准确的策略字符串。 在这个例子中,amberadmin的一个角色,所以策略p, admin, data1, read使得这个请求true。 这段代码的输出在注释中。

Casbin准备了很多这样的API。 这些API在基本的功能上增加了一些额外的功能。 它们是:

  • ok, err := enforcer.EnforceWithMatcher(matcher, request)

    与一个匹配器。

  • ok, reason, err := enforcer.EnforceExWithMatcher(matcher, request)

    EnforceWithMatcher()EnforceEx()的组合。

  • boolArray, err := enforcer.BatchEnforce(requests)

    对列表执行,然后返回一个数组

这是一个简单的Casbin使用案例。 你可以使用Casbin通过这些API来启动一个授权服务器。 我们将在接下来的段落中向你展示一些其他类型的API。

管理 API

Get API

这些API用于获取策略中的确切对象。 这一次,我们像最后一个例子一样加载了一个 enforcer 并从它中获得一些东西。

请阅读以下代码:

enforcer,err := casbin.NewEnforcer("./example/model.conf", "./example/policy.csv")
if err != nil {
    fmt.Printf("Error, details: %s\n", err)
}
allSubjects := enforcer.GetAllSubjects()
fmt.Println(allSubjects)

就行上一个例子一样,前四行代码从本地文档中载入了一些必要的信息。 我们将不再在这里谈这一点。

代码allSubjects := enforcer.GetAllSubjects() 把策略文档里的所有 subjects 提取出来,并且将它们作为一个数组返回。 然后我们打印这个数组

通常情况下,这段代码的输出会是这样:

[admin alice bob]

您也可以更改函数 GetAllSubjects()GetAllNamedSubjects(), 以获取当前命名策略中显示的 subjects 列表。

同样地,我们为 Objects, Actions, Roles 准备了 GetAll 函数 你唯一需要做的是,如果你想访问这些函数,将函数名称中的Subject一词改为你想要的。

同时,我们还有更多用于策略获取的API。 它们的调用方法和返回的值,都和上面提到的非常相似。

  • policy = e.GetPolicy()用于获取策略中的授权规则。
  • filteredPolicy := e.GetFilteredPolicy(0, "alice")用于获取策略中的授权的规则,可以自定义“域过滤器”(field filters)。
  • namedPolicy := e.GetNamedPolicy("p") 用于获取被命名的策略中所有被授权的规则
  • filteredNamedPolicy = e.GetFilteredNamedPolicy("p", 0, "bob")用于获取被命名的策略中所有被授权的规则,可以自定义“域过滤器”(field filters)。
  • groupingPolicy := e.GetGroupingPolicy()用于获取策略中所有任务继承规则。
  • filteredGroupingPolicy := e.GetFilteredGroupingPolicy(0, "alice")用于获取策略中所有任务继承规则,可以自定义“域过滤器”(field filters)。
  • namedGroupingPolicy := e.GetNamedGroupingPolicy("g")用于获取策略中所有任务继承规则。
  • namedGroupingPolicy := e.GetFilteredNamedGroupingPolicy("g", 0, "alice")用于获取策略中所有任务继承规则。

添加,删除,更新 API

Casbin为策略准备了很多API。 这些API允许您在运行时动态地添加、删除或编辑策略。

此代码向您展示了如何添加、删除和更新您的政策,并告诉您如何确认政策存在:

// 从文件中加载信息
enforcer,err := casbin.NewEnforcer("./example/model.conf", "./example/policy.csv")
if err != nil {
   fmt.Printf("Error, details: %s\n", err)
}

// 添加一条策略,然后使用 HasPolicy() 来确认
enforcer.AddPolicy("added_user", "data1", "read")
hasPolicy := enforcer.HasPolicy("added_user", "data1", "read")
fmt.Println(hasPolicy) // 若显示为 true,也就是我们成功添加了策略

// 移除一条策略,然后使用 HasPolicy() 来确认
enforcer.RemovePolicy("alice", "data1", "read")
hasPolicy = enforcer.HasPolicy("alice", "data1", "read")
fmt.Println(hasPolicy) // 若显示为 false,也就是我们成功删除了策略

// 更新一条策略,然后使用 HasPolicy() 来确认
enforcer.UpdatePolicy([]string{"added_user", "data1", "read"}, []string{"added_user", "data1", "write"})
hasPolicy = enforcer.HasPolicy("added_user", "data1", "read")
fmt.Println(hasPolicy) // 若显示为 false 原来的策略已失效
hasPolicy = enforcer.HasPolicy("added_user", "data1", "write")
fmt.Println(hasPolicy) // 若显示为true,则策略被成功更新

使用这四种API可以编辑策略。 像这些一样,我们为 FilteredPolicy, NamedPolicy, FilteredNamedPolicy, GroupingPolicy, NamedGroupingPolicy, FilteredGroupingPolicy, FilteredNamedGroupingPolicy准备了同样种类的API。 要使用它们,您只需要把函数名中的单词 Policy替换为上面提到的单词。

此外,如果你将参数更改为数组,你可以批量编辑你的策略。

例如,对于这样的函数:

enforcer.UpdatePolicy([]string{"eve", "data3", "read"}, []string{"eve", "data3", "write"})

如果我们把Policy 改为Policies,并编辑参数为:

enforcer.UpdatePolicies([][]string{{"eve", "data3", "read"}, {"jack", "data3", "read"}}, [][]string{{"eve", "data3", "write"}, {"jack", "data3", "write"}})

然后我们可以批量编辑这些策略。

同样的操作对GroupingPolicy、NamedGroupingPolicy也有用。

基于角色的访问控制接口

Casbin为你提供了来API来修改RBAC模型和策略。 如果你熟悉RBAC,你可以很容易地使用这些API:

这里我们只告诉你如何使用Casbin的RBAC APIs,而不会谈论RBAC本身。 您可以从这里获取详情。

我们使用这段代码来加载模型和政策,就像以前一样。

enforcer,err := casbin.NewEnforcer("./example/model.conf", "./example/policy.csv")
if err != nil {
    fmt.Printf("Error, details: %s\n", err)
}

然后,使用Enforcer enforcer 来访问这些API。

roles, err := enforcer.GetRolesForUser("amber")
fmt.Println(roles) // [admin]
users, err := enforcer.GetUsersForRole("admin")
fmt.Println(users) // [amber abc]

GetRolesForUser()返回一个数组,其中包含所有的角色。 在这个例子中,amber只有一个管理员角色,所以数组roles[admin]。 并且相似地,你可以用GetUsersForRole(),来获得所有归属于这个角色的用户。 此函数的返回值也是一个数组。

enforcer.HasRoleForUser("amber", "admin") // true

您可以使用HasRoleForUser()来确认用户是否属于该角色。 在这个例子中,amber是管理员的成员,所以这个函数的返回值是true.

fmt.Println(enforcer.Enforce("bob", "data2", "write")) // true
enforcer.DeletePermission("data2", "write")
fmt.Println(enforcer.Enforce("bob", "data2", "write")) // false

您可以使用 DeletePermission() 来删除权限。

fmt.Println(enforcer.Enforce("alice", "data1", "read")) // true
enforcer.DeletePermissionForUser("alice", "data1", "read")
fmt.Println(enforcer.Enforce("alice", "data1", "read")) // false

然后使用 DeletePermissionForUser() 来删除用户的权限。

Casbin有很多这样的API。 它们的调用方式和返回值,都与上文提到的API有同样的样式。 您可以在下一个文档里 下一个文档 找到这些API

← Cloud Native Middlewares管理 API →

最后更新:

类似资料

  • 概述 国际化和本地化的目的就是让一个网站应用能做到根据用户语种和指定格式的不同而提供不同的内容。 Django 对文本翻译, 日期、时间和数字的格式化,以及时区提供了完善的支持。 实际上,Django做了两件事: 由开发者和模板作者指定应用的哪些部分应该翻译,或是根据本地语种和文化进行相应的格式化。 根据用户的偏好设置,使用钩子将web应用本地化。 很显然,翻译取决于用户所选语言,而格式化通常取决

  • 虽然Django 满满的便捷性让Web 开发人员活得轻松一些,但是如果不能轻松地部署你的网站,这些工具还是没有什么用处。Django 起初,易于部署就是一个主要的目标。有许多优秀的方法可以轻松地来部署Django: 如何使用WSGI 部署 部署的检查清单 FastCGI 的支持已经废弃并将在Django 1.9 中删除。 如何使用FastCGI、SCGI 和AJP 部署Django 如果你是部署D

  • 本书概述 进程的概念大家都很熟悉,但你是否能准确说出僵尸进程的含义呢?还有 COW(Copy On Write)、Flock(File Lock)、Epoll 和 Namespace 的概念又是否了解过呢? 本书汇集了进程方方面面的基础知识,加上编程实例,保证阅读后能自如地回答以上问题,在项目开发中对进程的优化也有更深的理解。 本书架构 本书按循序渐进的方式介绍进程的基础概念和拓展知识,主要涵盖以

  • Docker在1.12.0和以上版本中增加了swarm模式。通过swarm模式管理的Docker Engines集群称之为“Swarm”。并可以通过Docker CLI来创建Swarm,在Swarm中部署应用服务,以及管理Swarm。 功能特点 在Docker Engines中集成了集群管理功能:通过Docker CLI可以创建一个用来发布应用services的swarm,而不需要安装其他任何额外

  • 这是 Elasticsearch 官方的 PHP 客户端。我们把 Elasticsearch-PHP 设计成低级客户端(低级设计模式),使用时不会偏离 REST API 的用法。 客户端所有方法几乎都与 REST API 对应,而且也与其他编程语言的客户端(如 ruby, python 等)方法结构相似。我们希望这种对应方式可以方便开发者更加容易上手客户端,且以最小的代价快速从一种编程语言转换到另

  • 特点 为什么用 Groovy?