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

相关文章

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码

Python打包成exe常用的四种方法小结

《Python打包成exe常用的四种方法小结》本文主要介绍了Python打包成exe常用的四种方法,包括PyInstaller、cx_Freeze、Py2exe、Nuitka,文中通过示例代码介绍的非... 目录一.PyInstaller11.安装:2. PyInstaller常用参数下面是pyinstal

Python 常用数据类型详解之字符串、列表、字典操作方法

《Python常用数据类型详解之字符串、列表、字典操作方法》在Python中,字符串、列表和字典是最常用的数据类型,它们在数据处理、程序设计和算法实现中扮演着重要角色,接下来通过本文给大家介绍这三种... 目录一、字符串(String)(一)创建字符串(二)字符串操作1. 字符串连接2. 字符串重复3. 字

python语言中的常用容器(集合)示例详解

《python语言中的常用容器(集合)示例详解》Python集合是一种无序且不重复的数据容器,它可以存储任意类型的对象,包括数字、字符串、元组等,下面:本文主要介绍python语言中常用容器(集合... 目录1.核心内置容器1. 列表2. 元组3. 集合4. 冻结集合5. 字典2.collections模块

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

MySQL设置密码复杂度策略的完整步骤(附代码示例)

《MySQL设置密码复杂度策略的完整步骤(附代码示例)》MySQL密码策略还可能包括密码复杂度的检查,如是否要求密码包含大写字母、小写字母、数字和特殊字符等,:本文主要介绍MySQL设置密码复杂度... 目录前言1. 使用 validate_password 插件1.1 启用 validate_passwo

Java Stream流以及常用方法操作实例

《JavaStream流以及常用方法操作实例》Stream是对Java中集合的一种增强方式,使用它可以将集合的处理过程变得更加简洁、高效和易读,:本文主要介绍JavaStream流以及常用方法... 目录一、Stream流是什么?二、stream的操作2.1、stream流创建2.2、stream的使用2.

Linux权限管理与ACL访问控制详解

《Linux权限管理与ACL访问控制详解》Linux权限管理涵盖基本rwx权限(通过chmod设置)、特殊权限(SUID/SGID/StickyBit)及ACL精细授权,由umask决定默认权限,需合... 目录一、基本权限概述1. 基本权限与数字对应关系二、权限管理命令(chmod)1. 字符模式语法2.