闲话权限系统的设计

一、权限的本质

权限管理,首先要理清权限的本质:权限就是对受保护资源的有限许可访问。
理解了权限的本质,就好谈权限的管理了。

权限就是对受保护资源的有限许可访问--这句话包含两层含义:
1,受保护的资源
2,有限的许可访问

但,本质上谈的都是对资源的访问,所以探讨权限问题,首先要定义资源。

二、资源的概念

    资源是一个抽象的概念,按照百科的词条解释,“资源”是指一国或一定地区内拥有的物力、财力、人力等各种物质要素的总称。分为自然资源和社会资源两大类。前者如阳光、空气、水、土地、森林、草原、动物、矿藏等;后者包括人力资源、信息资源以及经过劳动创造的各种物质财富等。
    在计算机软件中,资源指的是软件使用过程中使用的各种对象,功能,文件,网络等各种要素的总称。比如一个按钮所操作功能也算是一种资源;这样,菜单,按钮,页面等等,都可以算是资源。甚至,数据库的某个字段,也是资源。如果按照RESTFull API的思路去理解资源可能更好理解。

2.1 资源的识别

    资源多了,管理起来也有点麻烦,比如一个软件有很多按钮,要搞清楚这些按钮是比较困难的。把资源硬编码一个代号,对资源进行命名,对一类资源进行组织归类,这样复杂的系统就好管理了。

2.2 有限的资源

资源有很多,但并不是所有资源都是我们在当前领域需要关心的,我们要从所有资源中,整理出那些是受保护的有限资源。
两个定语:受保护,有限。


公开的且无限的资源,不需要保护了(当然不是完全不需要),比如阳光,比如以前的空气。但是,随着工业化的发展,空气也越来越需要保护了。
水资源,虽说是公开的,但是它是有限的,所以需要严格保护。野生动物,森林,都是需要保护的,它们的数量都是有限的。
由于人类活动范围的持续增大,几乎地球上所有的资源都不够了,总有一天,阳光也会成为稀缺的资源。所以,资源总是给人一种有限的感觉。

正因为资源是有限的特点,我们不能随意并且大量的使用,所以需要对这些资源进行保护,要访问(使用)资源,需要授权。
所以,权限就是对受保护资源的有限许可访问

三、权限的概念

3.1 权限的分类

 权限并不是一个独立的东西,它不是主体,是客体,所以它必须依附于一个主体。所以,我们常常根据权限所依附的主体来给权限分类:

  •   按照授权方式区分的权限类型:部门权限,人员权限,角色权限。

  •   按照软件层级区分:功能权限,业务权限,数据权限。


功能权限是指可访问的页面、菜单、按钮等,这些功能一般都在软件的“视图层”;
业务权限是指可以处理的一类业务,通常包含很多功能,比如一个功能,A业务可以修改,但是B业务只能查询;
数据权限是指哪些数据可以被什么对象访问。通常在数据库级别进行控制,比如:同样一个表,员工只能查询,经理可以修改。

3.2 权限的控制模型

    权限,实质上分为权限的受体和权限的配体,权限的受体在资源对象上,而权限的配体是权限访问者持有的访问秘钥,可以用细胞分子来理解受体和配体。只有当受体和配体有效结合以后,才代表权限执行成功,被访问的资源的状态发生了改变。可以用锁来举例理解,要开锁必须有钥匙,钥匙是权限的“配体”,而锁是权限的受体。锁接受了钥匙成功进行了配对,打开了锁,于是人打开了门,进入了房间,那么房间这个资源的状态就改变了。
    另外,权限还要区分拥有者和执行者,访问受保护资源的访问者,只要持有代表行使权限的访问秘钥,那么访问者就可以访问这个资源,也就说这个访问者有了访问这个资源的权限。
  这里有三个关键词:访问者,资源,秘钥


  访问者就是是权限的执行者,它可以是权限的拥有者,也可以是权限拥有者授权的代理人,就像公司的董事长和总经理的关系,董事长授权总经理经营管理公司,总经理代表董事长行使公司资产使用的权利。但是不管谁来行使访问权限,都要持有访问资源的秘钥,比如银行账户的密码。其实这个过程,做过微服务权限控制,都能明白。

  权限系统,跟国家的权力架构一样,也分为制定权限资源(立法),执行权限访问(司法),授予权限(行政)。组成权限系统的3个部分是相互分立,相互制约的。把权限系统的原理搞清楚了,那么设计权限系统的程序,就很简单了,能够做到完备且灵活。

3.3 权限的授权

    权限系统里面最常出现的就是角色,这叫做角色授权,当系统权限多了,势必要对权限进行一个分组(分类),这就是角色。所以,角色,仅仅是一个权限集合而已,因此授权的时候按角色授权要方便些,。但实际上,也可以按部门授权,或者按个人授权,或者,3者交叉授权。所以,最终一个系统的权限管理,复杂就复杂在这个地方,而如果权限授权不清晰,也容易出现推诿,扯皮的事情。所以,管理者授权,是很考验管理智慧的地方。

总结

权限系统分为三大部分:
1,系统使用的资源(菜单,按钮,页面,数据等等有限的可操作可访问的对象);
2,权限的识别,对资源系统中找出那些是需要进行受保护访问的而不是公开可操作的资源,对这样的资源进行分组和命名;
3,权限的授权(按角色授权,按部门授权,按个人授权等);
 

以上内容是我多年开发使用各种管理系统,并且最近跟朋友讨论的一点畅想,一家之言,仅供参考。


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

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

相关文章

初级Java开发与架构之间的差距不仅仅是开发时间

转载自 初级Java开发与架构之间的差距不仅仅是开发时间 一、基础篇 JVM JVM内存结构 堆、栈、方法区、直接内存、堆和栈区别 Java内存模型 内存可见性、重排序、顺序一致性、volatile、锁、final 垃圾回收 内存分配策略、垃圾收集器(G1)、GC算法…

欢乐SSL初二组周六赛【2019.4.27】

前言 AK???AK???AK??? 成绩 只放前101010,然后T3T3T3数据锅了一会 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCCDDD1112017WYC2017WYC2017WYC4004004001001001001001001001001001001001001002222016LJW2016LJW2016LJW39039039010010010010010…

gi如果某次提交错误,如何撤回

回退到指定commit版本 git reset --hard commit版本号强制推送到远程修改远程的commit git push --force

ASP.NET Core Web API下事件驱动型架构的实现(一):一个简单的实现

很长一段时间以来,我都在思考如何在ASP.NET Core的框架下,实现一套完整的事件驱动型架构。这个问题看上去有点大,其实主要目标是为了实现一个基于ASP.NET Core的微服务,它能够非常简单地订阅来自于某个渠道的事件消息,…

面试了 N 个候选人后,我总结出这份 Java 面试准备技巧

转载自 面试了 N 个候选人后,我总结出这份 Java 面试准备技巧 目录: 框架是重点,但别让人感觉你只会山寨别人的代码 别只看单机版的框架,分布式也需要了解 对于数据库,别只知道增删改查,得了解性能优化…

和某ZYC巨佬的随机挑战1总结

瞎搞事情经过 时间 忘了 地点 机房 人物 WYCWYCWYC蒟蒻和ZYCZYCZYC巨佬 起因 想瞎搞 经过 做题 结果 做完了 规则 luoguluoguluogu随机跳题,跳三道紫色题目来做。一个看脸的挑战。 题目 P2834−P2834-P2834−能力测验【数论,整除分块】 博客…

Scratc3.0作品转化成exe文件

Scratch 3的作品(sb3格式的文件)怎么生成可执行exe文件 Scratch 3.0和Scratch 2.0软件相比,界面和内部实现机制有了较大变化。 与以前2.0版本不同,Scratch3.0版本改用H5和JS语言编写;软件界面有较大变化,将…

来腾讯云开发者实验室 学习.NET Core 2.0

腾讯云开发者实验室为开发者提供了一个零门槛的在线实验平台,开发者实验室提供的能力:零门槛扫码即可免费领取实验机器,支持使用自有机器参与,实验完成后支持保留实验成果;在线 WEB IDE 支持 shell 命令操作,支持机器文…

Redis面试题(2020最新版)

转载自 Redis面试题(2020最新版) 概述 什么是Redis Redis(Remote Dictionary Server) 是一个使用 C 语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库。 Redis 可以存储键和五…

Spring Boot中mapper包所放位置的配置

其中mapper-locations是 扫描到对应的dao.xml 路径一定要写对,否则的话是跟java层同目录也可以 mybatis:mapper-locations: classpath:xyz/*.xmltype-aliases-package: com.example.demo.model如果是放到和mapper同目录下,需要在pom.xml中的build中加入…

P1137-旅行计划【拓扑排序,DAGdp】

正题 题目链接:https://www.luogu.org/problemnew/show/P1137 题目大意 一张有向无环图,求以每个点为终点的最长路径。 解题思路 先拓扑排序,然后dpdpdp fymax{fx1}(x−>y)f_ymax\{f_x1\}(x->y)fy​max{fx​1}(x−>y) codecodecode #includ…

Orleans介绍

一、介绍Orleans是一个框架,提供了一个直接的方法来构建分布式高规模计算应用程序默认可扩展 -》 Orleans处理构建分布式系统的复杂性,使您的应用程序能够扩展到数百台服务器。低延迟 -》 Orleans允许你在内存中保持你需要的状态,所以你的应用…

如何使用Mybatis-plus

使用Mybatis-plus需要使用两个依赖包&#xff08;缺一不可&#xff09; <!-- 导入mybatis-plus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus</artifactId><version>3.4.2</version></dependen…

Orleans安装

一、Nuget包Orleans NuGet软件包从v1.5.0开始在大多数情况下&#xff0c;您需要使用4个关键的NuGet包&#xff1a;1&#xff0c;Microsoft Orleans Build-time Code GenerationPM> Install-Package Microsoft.Orleans.OrleansCodeGenerator.Build为Grain接口和实现项目提供支…

Ch5702-Count The Repetitions【字符串,倍增,dp】

正题 题目大意 要求s2n2∗ms_2^{{n_2}*m}s2n2​∗m​是串s1n1s_1^{n_1}s1n1​​的字串&#xff0c;求最大的mmm 解题思路 首先求一个m′m&#x27;m′使得s2ms_2^ms2m​能够被s1n1s_1^{n_1}s1n1​​生成&#xff0c;然后可以从而求出mmm 倍增优化&#xff0c;设fi,jf_{i,j}f…

Spring Boot面试题(2020最新版)

转载自 Spring Boot面试题&#xff08;2020最新版&#xff09; 概述 什么是 Spring Boot&#xff1f; Spring Boot 是 Spring 开源组织下的子项目&#xff0c;是 Spring 组件一站式解决方案&#xff0c;主要是简化了使用 Spring 的难度&#xff0c;简省了繁重的配置&#x…

如何加快github的clone速度

有时候在github上下载一个项目需要很长的时间&#xff0c;甚至只有几k每秒&#xff0c;项目大了之后甚至直接下载失败。 这里有两种方法: 1、在GitHub域名后面加上.cnpmjs.org 正常的下载速度只有几十k每秒&#xff0c;但是在镜像上clone则能很大程度的节省时间&#xff0c;加…

Orleans入门

一、GrainsGrains是Orleans编程模型的关键原语。 Grains是Orleans应用程序的构建块&#xff0c;它们是隔离&#xff0c;分配和持久性的原子单元。 Grains是表示应用程序实体的对象。 就像在经典的面向对象编程&#xff08;Object Oriented Programming&#xff09;中一样&#…

jzoj4638-第三条跑道【欧拉函数,线段树】

正题 题目大意 要求支持区间乘和区间求∏φ(xi)\prod \varphi(x_i)∏φ(xi​) 解题思路 首先φ(n)n∗∏(pi−1pi)\varphi(n)n*\prod (\frac{p_i-1}{p_i})φ(n)n∗∏(pi​pi​−1​) 我们定义xl,rx_{l,r}xl,r​表示l∼rl\sim rl∼r的乘积ci,l,rc_{i,l,r}ci,l,r​为l∼rl\sim r…

爬虫基础5.24

request进阶第一步 1、爬取网页所有内容 import urllib.request fileurllib.request.urlopen(http://www.baidu.com) datafile.read() #读取全部 datalinefile.readline() #读取一行内容 print(data)添加请求头 java headers {user-agent: Mozilla/5.0 (Windows NT 1…