golang常用库之-golang常用库之-ladon包 | 基于策略的访问控制

2024-03-18 12:28

本文主要是介绍golang常用库之-golang常用库之-ladon包 | 基于策略的访问控制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • golang常用库之-ladon包 | 基于策略的访问控制
    • 概念
    • 使用
      • 策略
    • 条件 Conditions
      • 自定义condition
      • Ladon Condition使用示例
    • 持久化
    • 访问控制(Warden)
  • 结合 Gin 开发一个简易 ACL 接口
  • 参考

golang常用库之-ladon包 | 基于策略的访问控制

https://github.com/ory/ladon

Ladon是保护您资源的蛇龙。

Ladon是一个库,用于访问控制策略,类似于基于角色的访问控制或访问控制列表。与ACL和RBAC相比,您可以获得细粒度的访问控制,并能够在复杂环境中回答问题,例如多租户或分布式应用程序和大型组织。Ladon受到AWS IAM Policies 的启发。

A SDK for access control policies: authorization for the microservice and IoT age. Inspired by AWS IAM policies. Written for Go.

Ladon 是用 Go 语言编写的用于实现访问控制策略的库,类似于 RBAC(基于角色的访问控制系统,Role Based Access Control)和 ACL(访问控制列表,Access Control Lists)。但是与 RBAC 和 ACL 相比,Ladon 可以实现更细粒度的访问控制,并且能够在更为复杂的环境中(例如多租户、分布式应用程序和大型组织)工作。

概念

Ladon is an access control library that answers the question:

Who is able to do what on something given some context

  • Who: An arbitrary unique subject name, for example “ken” or “printer-service.mydomain.com”.
  • Able: The effect which can be either “allow” or “deny”.
  • An arbitrary action name, for example “delete”, “create” or “scoped:action:something”.
  • Something: An arbitrary unique resource name, for example “something”, “resources.articles.1234” or some uniform resource name like “urn:isbn:3827370191”.
  • Context: The current context containing information about the environment such as the IP Address, request date, the resource owner name, the department ken is working in or any other information you want to pass along. (optional)

通常来说,一条完整的策略可以明确告诉我们:谁在特定环境下可以做什么。

  • subject:对应「谁」,即主体。

  • action:对应「可以做」,即操作的种类,比如增删改查。

  • resource:对应「做什么」,即具体操作的资源。

  • context:对应「特定环境」,即一些限制条件,可选。

使用

我们已经讨论了Ladon的两个基本部分:policies 和access control requests。让我们仔细看看这两个人。

策略

Ladon 解决了这个问题:在特定的条件下,谁能够 / 不能够对哪些资源做哪些操作。为了解决这个问题,Ladon 引入了授权策略。授权策略是一个有语法规范的文档,这个文档描述了谁在什么条件下能够对哪些资源做哪些操作。 Ladon 可以用请求的上下文,去匹配设置的授权策略,最终判断出当前授权请求是否通过

策略是访问控制决策的基础。将它们视为一系列规则。 在这个库中,策略被抽象为Ladon.Policy接口,Ladon附带了这个接口的标准实现,它是Ladon.defaultPolicy。创建这样的策略可以如下所述:

import "github.com/ory/ladon"var pol = &ladon.DefaultPolicy{// A required unique identifier. Used primarily for database retrieval.ID: "68819e5a-738b-41ec-b03c-b58a1b19d043",// A optional human readable description.Description: "something humanly readable",// A subject can be an user or a service. It is the "who" in "who is allowed to do what on something".// As you can see here, you can use regular expressions inside < >.Subjects: []string{"max", "peter", "<zac|ken>"},// Which resources this policy affects.// Again, you can put regular expressions in inside < >.Resources: []string{"myrn:some.domain.com:resource:123", "myrn:some.domain.com:resource:345","myrn:something:foo:<.+>", "myrn:some.domain.com:resource:<(?!protected).*>","myrn:some.domain.com:resource:<[[:digit:]]+>"},// Which actions this policy affects. Supports RegExp// Again, you can put regular expressions in inside < >.Actions: []string{"<create|delete>", "get"},// Should access be allowed or denied?// Note: If multiple policies match an access request, ladon.DenyAccess will always override ladon.AllowAccess// and thus deny access.Effect: ladon.AllowAccess,// Under which conditions this policy is "active".Conditions: ladon.Conditions{// In this example, the policy is only "active" when the requested subject is the owner of the resource as well."resourceOwner": &ladon.EqualsSubjectCondition{},// Additionally, the policy will only match if the requests remote ip address matches address range 127.0.0.1/32"remoteIPAddress": &ladon.CIDRCondition{CIDR: "127.0.0.1/32",},},
}

下面是一个 Ladon 的授权策略样例:


{"description": "One policy to rule them all.","subjects": ["users:<peter|ken>", "users:maria", "groups:admins"],"actions" : ["delete", "<create|update>"],"effect": "allow","resources": ["resources:articles:<.*>","resources:printer"],"conditions": {"remoteIP": {"type": "CIDRCondition","options": {"cidr": "192.168.0.1/16"}}}
}

策略(Policy)由若干元素构成,用来描述授权的具体信息,你可以把它们看成一组规则。核心元素包括主题(Subject)、操作(Action)、效力(Effect)、资源(Resource)以及生效条件(Condition)。元素保留字仅支持小写,它们在描述上没有顺序要求。对于没有特定约束条件的策略,Condition 元素是可选项。一条策略包含下面 6 个元素:

  • 主题(Subject),主题名是唯一的,代表一个授权主题。例如,“ken” or “printer-service.mydomain.com”。
  • 操作(Action),描述允许或拒绝的操作。
  • 效力(Effect),描述策略产生的结果是“允许”还是“拒绝”,包括 allow(允许)和 deny(拒绝)。
  • 资源(Resource),描述授权的具体数据。
  • 生效条件(Condition),描述策略生效的约束条件。
  • 描述(Description),策略的描述。

有了授权策略,我们就可以传入请求上下文,由 Ladon 来决定请求是否能通过授权。下面是一个请求示例:

{"subject": "users:peter","action" : "delete","resource": "resources:articles:ladon-introduction","context": {"remoteIP": "192.168.0.5"}
}

可以看到,在 remoteIP=“192.168.0.5” 生效条件(Condition)下,针对主题(Subject) users:peter 对资源(Resource) resources:articles:ladon-introduction 的 delete 操作(Action),授权策略的效力(Effect)是 allow 的。所以 Ladon 会返回如下结果:

{"allowed": true
}

Ladon 支持很多 Condition

条件 Conditions

在这里插入图片描述

在这里插入图片描述
Conditions 功能是返回 true 或 false 在给定的 context。因为conditions 实现逻辑,因此必须编程它们。策略中添加条件包括两个部分,一个a key name和Ladon.Condition接口的实现:

自定义condition

Ladon Condition使用示例
参考URL: https://github.com/marmotedu/geekbang-go/blob/master/LadonCondition%E4%BD%BF%E7%94%A8%E7%A4%BA%E4%BE%8B.md

我们还可以自定义condition,然后将自定义的condition添加到ladon.ConditionFactories中,例如:

import "github.com/ory/ladon"func main() {// ...ladon.ConditionFactories[new(CustomCondition).GetName()] = func() Condition {return new(CustomCondition)}// ...
}

自定义condition很简单,读者可以参考ory/ladon项目根目录下的condition_boolean.go文件,将BooleanCondition替换为CustomCondition就得到了一个简单的自定义condition。

Ladon Condition使用示例

Ladon Condition使用示例
参考URL: https://github.com/marmotedu/geekbang-go/blob/master/LadonCondition%E4%BD%BF%E7%94%A8%E7%A4%BA%E4%BE%8B.md

持久化

访问控制(Warden)

现在我们已经确定了我们的策略,我们可以使用Warden检查请求是否有效。Ladon.Ladon,这是Ladon.Warden接口的默认实现定义ladon.Ladon.IsAllowed()如果可以授予访问请求并否则错误,则会返回nil。

import "github.com/ory/ladon"func main() {// ...err := warden.IsAllowed(&ladon.Request{Subject: "peter",Action: "delete",Resource: "myrn:some.domain.com:resource:123",Context: ladon.Context{"ip": "127.0.0.1",},})if err != nil {log.Fatal("Access denied")}// ...
}

结合 Gin 开发一个简易 ACL 接口

结合 Gin 开发一个简易 ACL 接口
参考URL: https://www.bilibili.com/read/cv6934197/

通常来说,一条完整的策略可以明确告诉我们:谁在特定环境下可以做什么。

  • subject:对应「谁」,即主体。

  • action:对应「可以做」,即操作的种类,比如增删改查。

  • resource:对应「做什么」,即具体操作的资源。

  • context:对应「特定环境」,即一些限制条件,可选。

参考

技术·原创 | 零信任与基于策略的访问控制
参考URL: https://blog.csdn.net/xixiangkeji/article/details/115177593
从零开始入门 K8s | K8s 安全之访问控制
参考URL: https://www.kubernetes.org.cn/6974.html
Go 语言项目开发实战
参考URL: https://time.geekbang.org/column/article/404542
Ladon 折腾手记:结合 Gin 开发一个简易 ACL 接口
参考URL: https://www.bilibili.com/read/cv6934197/

这篇关于golang常用库之-golang常用库之-ladon包 | 基于策略的访问控制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/822324

相关文章

Golang中拼接字符串的6种方式性能对比

《Golang中拼接字符串的6种方式性能对比》golang的string类型是不可修改的,对于拼接字符串来说,本质上还是创建一个新的对象将数据放进去,主要有6种拼接方式,下面小编就来为大家详细讲讲吧... 目录拼接方式介绍性能对比测试代码测试结果源码分析golang的string类型是不可修改的,对于拼接字

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

Redis 内存淘汰策略深度解析(最新推荐)

《Redis内存淘汰策略深度解析(最新推荐)》本文详细探讨了Redis的内存淘汰策略、实现原理、适用场景及最佳实践,介绍了八种内存淘汰策略,包括noeviction、LRU、LFU、TTL、Rand... 目录一、 内存淘汰策略概述二、内存淘汰策略详解2.1 ​noeviction(不淘汰)​2.2 ​LR

C#中的 Dictionary常用操作

《C#中的Dictionary常用操作》C#中的DictionaryTKey,TValue是用于存储键值对集合的泛型类,允许通过键快速检索值,并且具有唯一键、动态大小和无序集合的特性,常用操作包括添... 目录基本概念Dictionary的基本结构Dictionary的主要特性Dictionary的常用操作

Golang基于内存的键值存储缓存库go-cache

《Golang基于内存的键值存储缓存库go-cache》go-cache是一个内存中的key:valuestore/cache库,适用于单机应用程序,本文主要介绍了Golang基于内存的键值存储缓存库... 目录文档安装方法示例1示例2使用注意点优点缺点go-cache 和 Redis 缓存对比1)功能特性

Golang中map缩容的实现

《Golang中map缩容的实现》本文主要介绍了Go语言中map的扩缩容机制,包括grow和hashGrow方法的处理,具有一定的参考价值,感兴趣的可以了解一下... 目录基本分析带来的隐患为什么不支持缩容基本分析在 Go 底层源码 src/runtime/map.go 中,扩缩容的处理方法是 grow

golang获取prometheus数据(prometheus/client_golang包)

《golang获取prometheus数据(prometheus/client_golang包)》本文主要介绍了使用Go语言的prometheus/client_golang包来获取Prometheu... 目录1. 创建链接1.1 语法1.2 完整示例2. 简单查询2.1 语法2.2 完整示例3. 范围值

golang panic 函数用法示例详解

《golangpanic函数用法示例详解》在Go语言中,panic用于触发不可恢复的错误,终止函数执行并逐层向上触发defer,最终若未被recover捕获,程序会崩溃,recover用于在def... 目录1. panic 的作用2. 基本用法3. recover 的使用规则4. 错误处理建议5. 常见错

Python中常用的四种取整方式分享

《Python中常用的四种取整方式分享》在数据处理和数值计算中,取整操作是非常常见的需求,Python提供了多种取整方式,本文为大家整理了四种常用的方法,希望对大家有所帮助... 目录引言向零取整(Truncate)向下取整(Floor)向上取整(Ceil)四舍五入(Round)四种取整方式的对比综合示例应

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为