惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Schneier on Security
Security Archives - TechRepublic
Security Archives - TechRepublic
T
Threat Research - Cisco Blogs
G
GRAHAM CLULEY
P
Privacy & Cybersecurity Law Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
Cisco Talos Blog
Cisco Talos Blog
The Hacker News
The Hacker News
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Cyber Attacks, Cyber Crime and Cyber Security
Security Latest
Security Latest
Know Your Adversary
Know Your Adversary
P
Palo Alto Networks Blog
C
Cisco Blogs
AWS News Blog
AWS News Blog
T
Threatpost
L
LINUX DO - 热门话题
Simon Willison's Weblog
Simon Willison's Weblog
Scott Helme
Scott Helme
C
Cybersecurity and Infrastructure Security Agency CISA
T
Tor Project blog
Cyberwarzone
Cyberwarzone
P
Proofpoint News Feed
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
The Exploit Database - CXSecurity.com
The Register - Security
The Register - Security
D
Darknet – Hacking Tools, Hacker News & Cyber Security
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
罗磊的独立博客
云风的 BLOG
云风的 BLOG
V
Vulnerabilities – Threatpost
N
News | PayPal Newsroom
Project Zero
Project Zero
NISL@THU
NISL@THU
博客园_首页
MyScale Blog
MyScale Blog
V2EX - 技术
V2EX - 技术
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
F
Full Disclosure
T
Troy Hunt's Blog
Recorded Future
Recorded Future
N
Netflix TechBlog - Medium
P
Privacy International News Feed
H
Hackread – Cybersecurity News, Data Breaches, AI and More
A
Arctic Wolf
C
Check Point Blog
W
WeLiveSecurity
Apple Machine Learning Research
Apple Machine Learning Research
C
CERT Recently Published Vulnerability Notes

夜行人

回家路上 第一期的直播演示项目 震动检测器 正能量 在线参观CodeLab Neverland 发布 CodeLab Adapter 3.3.1 DynamicTable 之 纸糊方向盘 CodeLab DynamicTable: 一个可实施的技术方案 CodeLab Insight 发布 Alpha 版 情人节 Home Assistant 周报 && IoT 周报 (02) Joplin: 关注隐私的 Evernote 开源替代软件 浏览器的未来与 Web 传感器 Home Assistant 周报 && IoT 周报 (01) 百宝箱(01) 论自由 介绍 WebThings Home Assistant 周报 && iot 周报 (00) 百宝箱(00) 毛姆读书心得 传世之作 周末徒步 CodeLab Adapter ❤️ Jupyter/Python 航班 躲雨 夏令营途中 [译]思想--作为一种技术 The future of coding 美国之行 三门问题的程序模拟 从Python转向Pharo https://blog.just4fun.site/post/iot/iot-open-source-projects/ Python异步编程笔记 https://blog.just4fun.site/post/iot/iot-open-source-hardware-community/ 万物积木化开发者社区 CodeLab ❤️ Blender Scratch3技术分析之云变量 API(第7篇) [译]对管道(Pipes)的偏爱 [译]提出正确的问题比得到正确答案更重要 蓝牙设备与Scratch3.0 创建你的第一个Scratch3.0 Extension Scratch3技术分析之项目内部数据(第6篇) Scratch3技术分析之社区 API(第5篇) Scratch3技术分析之User API(第4篇) Scratch3技术分析之项目主页API(第3篇) Scratch3技术分析之静态资源API(第2篇) Scratch3.0、micro:bit与Windows7 https://blog.just4fun.site/post/iot/zerynth-vs-micropython/ 核聚变、方所与半宅空间 可视化编程为何是个糟糕的主意 codelab.club周末聚会 关于codelab.club '下一件大事'是一个房间 Hungry Robot - Eat everything 编程作为一种思考方式 今日简史 史蒂夫·乔布斯传 罗素自选文集 https://blog.just4fun.site/post/edx/tianjin-scratch-ai/ https://blog.just4fun.site/post/edx/richie-cms-openedx/ 徒步武功山 WebUSB与micro:bit 积木化编程与3D场景 夜宿武功山顶 scratch3-adapter接入优必选Alpha系列机器人 https://blog.just4fun.site/post/edx/video-migration-note/ scratch3-adapter重构笔记 https://blog.just4fun.site/post/edx/edx-community-members/ 两种硬件编程风格的比较 使用micro:bit自制PPT翻页笔 柏拉图对话集 scratch3.0 + micro:bit 七月电影放映计划 非营利组织的管理 Screenly--用树莓派让任何屏幕变为可编程的数字标牌 以最佳实践开始你的Django项目 micro:bit与事件驱动 为Scratch3.0设计的插件系统(上篇) OCR应用一例 近两年读过的一些好书 blockly开发之使用python驱动浏览器中的turtle(2) 牛顿新传 文学理论入门 逻辑的引擎 人生的意义 blockly开发之生成并运行js代码(1) blockly开发之hello world(0) micro:bit使用笔记 神器之Termux https://blog.just4fun.site/post/iot/micropython-notes/ Cozmo what is this Scratch的前世今生 下段旅程 我行在远方 爆裂 途中杂记 https://blog.just4fun.site/post/edx/open-edx-startup/ cozmo系列之入门 - 有性格且可编程的机器人 PaperWeekly开发笔记 创业二三事
理解权限系统
2016-09-06 · via 夜行人

现实世界只不过是反射出了更高层次的世界的阴影 — 柏拉图

计算机世界中的许多事物是现实世界的一个投影,现实中所见的许多模式/概念在计算机世界里都能找到

权限作为现实世界随处可见的概念,在我们谈论私有制所有权时,时常会谈及权限,在计算机世界中,权限在许多系统中举足轻重

下边我们将以几个案例来帮助理解权限系统的概念和设计,这些案例包括:

  • linux操作系统中的权限系统
  • 微信朋友圈中的权限
  • django中的权限机制

近期工作中遇到一个系统设计中关于权限的复杂问题(层级组织),本文是我学习权限系统及对此思考的一个小结

linux中的权限系统

关于权限系统,我们以linux为切入点,它为大多技术人员所熟悉。我们重点关注其中的概念,而对实现细节不做深究

linux是个多用户操作系统,这每个用户有自己的工作空间(home目录)。就好比多人住在一套公寓里,各自有自己的房间。

在linux中一切皆文件,linux鼓励使用文本文件,人和机器能理解文本文件,成为人与机器交流的最好途径。在linux中权限问题往往最终会落到文件的权限上。

如果我们把文件视为一种资源。那么我们会发现 权限往往围绕这些概念:

  • 用户
  • 用户组(群组)
  • 资源
  • 权限类型

如果你对上述概念不大熟悉,推荐阅读鸟哥的Linux 的文件权限与目录配置

上边几个概念中,鸟哥对用户组的解释很棒(意义和功能),推荐一读

总结来说,Linux一般将文件关联的身份分为三个类别,分别是 owner/group/others,且三种身份各有 read/write/execute 权限

我们举个本地文件的例子

1
2
ls -l /tmp/test.txt
# -rw-r--r--  1 wwj  wheel  235103  9  7 10:26 /tmp/test.txt

我们在此引用鸟哥文章里的这张图

上述信息表示:文件/tmp/test.txt是文件(-),文件拥有者(wwj)的权限为rw-(读写),文件拥有群组(wheel)的权限为r--(读),其他人的权限为r--(读)

如果你想改变文件属性与权限,可以使用:

  • chgrp :改变文件所属群组
  • chown :改变文件拥有者
  • chmod :改变文件的权限

有了群组/资源/用户这些概念,之后我们就可以这样表达权限了:

  • A用户有资源B的可读权限(r)
  • 群组X有资源Y的可读权限(r)

朋友圈中的分组与权限

在用户/群组/资源/权限类型的视角下,我们可以这样理解微信朋友圈的分组功能:

你半夜回家发了一条: 今天大学聚会很开心,为了让没到现场的同学也看到聚会情况,于是附上了聚会照片,你怕被小伙伴诟病为天天晒吃的,于是决定这条消息只对大学同学组可见,这样只有在大学同学组(群组)里的同学(用户)才能看到(可读权限)聚会消息(资源)

RBAC

如果我们进一步抽象,我们便总结出了基于角色的访问控制(Role-Based Access Control,RBAC)

Who对What进行How操作

我们可以看到这种模式:

大学同学组里的同学(who)才能看到(how)聚会消息(what)

RBAC认为权限授权实际上是Who、What、How的问题

在RBAC模型中,who、what、how构成了访问权限三元组,也就是Who对What进行How的操作,各个要素的含义如下:

  • Who:权限的拥用者或主体(如User、Group、Role)
  • What:权限针对的对象或资源(Resource)。
  • How:具体的权限

特点

模型中概念与实际系统紧密对应。RBAC模型中的角色、用户和许可权等概念都是实际系统实际存在的实体,便于设计者建立现存的或待建系统的RBAC模型

分治的思路

  • 我们要分割这些问题来讨论(分析的思路/分治)
    • 用户与角色的指派
    • 角色与权限的指派
    • 为定义角色的继承 进行的角色与角色的指派。

上述这些活动都要求把用户和权限联系起来。多数情况下它们最好由不同的管理员或管理角色来做。对角色指派权限是典型的应用管理者的职责(类似元角色)

概念解释

  • Group:用户组,权限分配的单位与载体。组可以包括组(以实现权限的继承)(适合用来处理层级问题),也可以包含用户,组内用户继承组的权限。User与Group是多对多的关系。Group可以层次化,以满足不同层级权限控制的要求。 (漂亮解决了我的问题)
    • 部门Department或组织Organization,都可以对应到Group
  • Role:Role和User关系的左右两边都是Many-to-Many关系,角色是为了完成各种工作而创造,用户则依据它的责任和资格来被指派相应的角色,角色配置成其完成任务所需要的最小的权限集
  • 许可表(PERMISSIONS)包括许可标识、许可名称、受控对象、操作标识。许可表给出了受控对象与操作算子的对应关系。*

其他笔记

  • RBAC都是基于关系模型
  • 资源是受控对象
  • RBAC模型支持数据抽象原则和继承概念
  • RBAC模型没有提供操作顺序控制机制

Django中的权限机制

这部分主要参考Django权限机制的实现

如果你对Django熟悉(不熟悉的话参考你所用web框架的权限机制),可以把这部分理解为以Django为例,解释如何把权限概念用于web项目

在web应用中,权限机制能够约束用户行为,控制页面的显示内容(想想你的朋友圈和各种论坛的会员机制),也能使API更加安全和灵活(django-rest-framework中)

Django中用user, grouppermission完成了权限机制(和linux很像),这些概念,我们在前文中阐述清楚了,这个权限机制是将属于model的某个permission赋予user或group,可以理解为全局的权限(ps:如果你需要更细分的权限机制,可以试试:django-guardian

Django的权限项

Django用permission(如前文说的许可表)对象存储权限项(How),每个model默认都有三个permission,即add model, change model和delete model,在admin中你可以看到,当然我们也可以手动添加其他权限项,不过值得注意的是权限是针对model的,而不是instance的!

为一个用户添加权限,既可以在view里做(编码),也可以由管理员(Role)在admin里做(不需要编码)

使用权限

  • 在view中,使用装饰器来验证权限:@permission_required('car.can_drive')
  • 在模板中,当前登录用户的权限存储在模板变量 {{ perms }}

todo

  • LDAP 认证和权限

参考

相关概念

django

linux