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

news2025/1/11 11:51:42

文章目录

  • 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/

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MySQL】 MySQL的内置函数——日期函数、字符串函数、数学函数、聚合函数、其他函数

文章目录 MySQL1. 日期函数1.1 查看时间1.2 对时间进行计算 2. 字符串函数2.1 字符串查找2.2 字符串修改显示 3. 数学函数4. 聚合函数5. 其他函数 MySQL 1. 日期函数 在MySQL中&#xff0c;提供了多种时间函数供我们使用&#xff0c;其中包括用于查看时间的函数和计算日期的函数…

Vue2 引入使用ElementUI详解

目录 1 安装2 引入2.1 全局引入2.1.1 引入2.1.2 使用 2.2 按需引入2.2.1 引入2.2.2 使用 3 总结 1 安装 推荐使用 npm 的方式安装&#xff0c;它能更好地和 webpack打包工具配合使用。&#xff08;本项目使用安装方式&#xff09; npm i element-ui -S也可以使用其他的包管理…

网络学习:邻居发现协议NDP

目录 前言&#xff1a; 一、报文内容 二、地址解析----NS/NA 目标的被请求组播IP地址 邻居不可达性检测&#xff1a; 重复地址检测 路由器发现 地址自动配置 默认路由器优先级和路由信息发现 重定向 前言&#xff1a; 邻居发现协议NDP&#xff08;Neighbor Discovery…

RequestResponse使用

文章目录 一、Request&Response介绍二、Request 继承体系三、Request 获取请求数据1、获取请求数据方法&#xff08;1&#xff09;、请求行&#xff08;2&#xff09;、请求头&#xff08;3&#xff09;、请求体 2、通过方式获取请求参数3、IDEA模板创建Servlet4、请求参数…

作品展示ETL

1、ETL 作业定义、作业导入、控件拖拽、执行、监控、稽核、告警、报告导出、定时设定 欧洲某国电信系统数据割接作业定义中文页面&#xff08;作业顶层&#xff0c;可切英文&#xff0c;按F1弹当前页面帮助&#xff09; 涉及文件拆分、文件到mysql、库到库、数据清洗、数据转…

verilog 从入门到看得懂---verilog 的基本语法数据和运算

笔者之前主要是使用c语言和matab 进行编程&#xff0c;从2024年年初开始接触verilog&#xff0c;通过了一周的学习&#xff0c;基本上对verilog 的语法有了基本认知。总统来说&#xff0c;verilog 的语法还是很简单的&#xff0c;主要难点是verilog是并行运行&#xff0c;并且强…

【LabVIEW FPGA入门】插值、输出线性波形

概述 NI 的可重配置 I/O (RIO) 硬件使开发人员能够创建自定义硬件&#xff0c;以在坚固耐用、高性能和模块化架构中执行许多任务&#xff0c;而无需了解低级 EDA 工具或硬件设计。使用 RIO 硬件轻松实现的此类任务之一是模拟波形生成。本教程介绍了使用 CompactRIO 硬件和 LabV…

旧华硕电脑开机非常慢 电脑开机黑屏很久才显示品牌logo导致整体开机速度非常的慢怎么办

前提条件 电池需要20&#xff05;&#xff08;就是电池没有报废&#xff09;且电脑接好电源&#xff0c;千万别断电&#xff0c;电脑会变成砖头的 解决办法 更新bios即可解决&#xff0c;去对应品牌官网下载最新的bios版本就行了 网上都是一些更新驱动啊

VS2019加QT5.14中Please assign a Qt installation in ‘Qt Project Settings‘.问题的解决

第一篇&#xff1a; 原文链接&#xff1a;https://blog.csdn.net/aoxuestudy/article/details/124312629 error:There’ no Qt version assigned to project mdi.vcxproj for configuration release/x64.Please assign a Qt installation in “Qt Project Settings”. 一、分…

数据分析 | Matplotlib

Matplotlib 是 Python 中常用的 2D 绘图库&#xff0c;它能轻松地将数据进行可视化&#xff0c;作出精美的图表。 绘制折线图&#xff1a; import matplotlib.pyplot as plt #时间 x[周一,周二,周三,周四,周五,周六,周日] #能量值 y[61,72,66,79,80,88,85] # 用来设置字体样式…

RunnerGo测试平台的安装和使用

文章适用于想RunnerGo入门的同学&#xff0c;本人主要是后端&#xff0c;这里做一个入门的学习记录。想深入适用RunnerGo的同学可以参考官网文档&#xff1a; https://wiki.runnergo.cn/docs/ 这里我测试的代码是之前搭建的一个前后端分离小demo&#xff0c;代码地址是https:/…

交流互动系统|基于springboot框架+ Mysql+Java+Tomcat的交流互动系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;ssm&#xff0c;springboot的平台设计与实现项目系统开发资源&#xff08;可…

【UE5】非持枪趴姿移动混合空间

项目资源文末百度网盘自取 创建角色在非持枪状态趴姿移动的动画混合空间 在BlendSpace文件夹中单击右键选择 动画(Animation) 中的混合空间(Blend Space) 选择SK_Female_Skeleton 命名为BS_NormaProne 打开BS_NormaProne 水平轴表示角色的方向&#xff0c;命名为Directi…

腾讯云服务器配置2核4G5M带宽是什么意思?

腾讯云服务器2核4G5M带宽配置是代表什么&#xff1f;代表2核CPU、4G内存、5M公网带宽&#xff0c;这是一款轻量应用服务器&#xff0c;系统盘为60GB SSD云硬盘&#xff0c;活动页面 txybk.com/go/txy 活动打开如下图&#xff1a; 腾讯云2核4G5M服务器 如上图所示&#xff0c;这…

Linux 用户及用户组管理

目录 1——添加用户&#xff08;useradd&#xff09; 2——删除用户&#xff1a;userdel 3——修改用户&#xff1a;usermod 4——记住用户操作&#xff1a;history 5——查看用户信息&#xff1a;id 6——用户切换&#xff1a;su 问题1&#xff1a;遇到当前的用户不能使…

[蓝桥杯 2021 省 A] 左孩子右兄弟

一、问题描述 P8744 [蓝桥杯 2021 省 A] 左孩子右兄弟 二、问题简析 2.1 左孩子右兄弟 首先&#xff0c;我们要了解怎么通过“左孩子右兄弟”表示法将多叉树转化为二叉树&#xff1a;对于一棵多叉树&#xff0c;一个父节点有多个子节点&#xff0c;将第一个子节点作为父节点…

警惕MKP勒索病毒,您需要知道的预防和恢复方法。

引言&#xff1a; 在网络世界中&#xff0c;.mkp勒索病毒是一股威胁不可小觑的黑暗势力。它以其毒辣的加密手段威胁着我们的数据安全。本文将深入介绍.mkp勒索病毒&#xff0c;揭示如何恢复被其加密的数据文件&#xff0c;并分享一些预防措施&#xff0c;助您在数字世界中安全…

Linux:网络相关概念的认识

文章目录 基本认知数据跨网络传输初识ip地址 端口号端口号的理解 本篇是基于前面对于网络的基本框架搭建&#xff0c;进而进行相关概念的进一步理解&#xff0c;为后续准备 基本认知 那么首先总结一下一些基本的相关结论性的信息 对于任何协议来说&#xff0c;它本身都应该拥…

Langchain-chatchat+ChatGlm3-6b部署

我的环境 台式机 内存&#xff1a;16GB 显卡&#xff1a;GTX1060-6G 1. 基础环境准备 1.1. 安装anaconda&#xff0c;创建环境python版本3.11 conda create -n chatglm3 python3.11 conda activate chatglm3 1.2. 搭建cuda环境 # 查看cuda版本&#xff0c;版本是CUDA V…

如何订阅Midjourney

Midjourney介绍 Midjourney作为目前AI绘画领域效果卓越且备受青睐的工具&#xff0c;对于新用户而言&#xff0c;可能无法享受到免费试用的机会。因此&#xff0c;为了持续利用这款软件进行绘画创作&#xff0c;用户需要购买会员资格并开通订阅服务。那么&#xff0c;关于midj…