权限系统(3)-- subject
权限控制中,subject可能不会简单的对应于userId, 而是包含一系列的security token或certificate, 例如用户登陆地址,登陆时间等。一般情况下,这些信息在权限系统中的使用都是很直接的,不会造成什么问题。
subject域中最重要的结构是user和role的分离,可以在不存在user的情况下,为role指定权限。有人进一步定义了userGroup的概念,可以为userGroup指定role,而user从其所属的group继承role的设置。一般情况下,我不提倡在权限系统中引入userGroup的概念。这其中最重要的原因就是它会造成多条权限信息传递途径,从而产生一种路径依赖, 并可能出现信息冲突的情况。一般user与group的关联具有明确的业务含义,因而不能随意取消。如果我们希望对user拥有的权限进行细调,除去user从group继承的某个不应该拥有的权限,解决的方法很有可能是所谓的负权限,即某个权限条目描述的是不能做某某事。负权限会造成各个权限设置之间的互相影响,造成必须尝试所有权限规则才能作出判断的困境,引出对额外的消歧策略的需求,这些都极大的限制了系统的可扩展性。在允许负权限的环境中,管理员将无法直接断定某个权限设置的最终影响,他必须在头脑中完成所有的权限运算之后才能理解某用户最终拥有的实际权限,如果发现权限设置冲突,管理员可能需要多次尝试才能找到合适方案。这种配置时的推理需求可能会增加配置管理的难度,造成微妙的安全漏洞,而且负权限导致的全局关联也降低了权限系统的稳定性。我更倾向于将group作为权限设置时的一种辅助标记手段,系统中只记录用户最终拥有的角色,即相当于记录用户通过group拥有权限的推导完成的结果, 如果需要权限细调,我们直接在用户拥有的角色列表上直接进行。当然,如果实现的复杂一些,权限系统对外暴露的接口仍然可以模拟为能够指定userGroup的权限。
推理在面向对象语言中最明显的表现是继承,所以有些人将subject域中的推理直接等价于role之间的继承问题,这未必是最好的选择。继承可以形成非常复杂的推理关系,但是可能过于复杂了(特别是直接使用sql语句无法实现树形推理查询)。按照级列理论,从不相关发展到下一阶段是出现简单的序关系,即我们可以说subject出现级别上的差异,高级别subject将自动具有低级别的权限。一种选择是定义roleRank,规定高级别role自动具有低级别role的权限,但考虑到user与role的两分结构,我们也可以同时定义userRank和roleRank,规定高级别user自动具有低级别的role,而role之间不具有推理关系。在面向对象领域中,我们已经证实了完全采用继承来组织对象关系会导致系统的不稳定,所以我倾向于第二种选择,即将role看作某种类似于interface的东西,一种权限的切片。为了进一步限制这种推导关系,我们可以定义所谓的安全域的概念. security domain, 规定推导只能在一定的域中才能进行。
select user.userId, role.roleId
from user, role
where user.userRank > role.roleRank
and user.domain = role.domain
将权限控制一般需要施加在最细的粒度上,这在复杂的系统中可能过于理想化了。复杂的情况下我们需要进行局部化设计,即进行某些敏感操作之前进行一系列复杂的权限校验工作。当完成这些工作之后,进入某个security zone, 在其中进行操作就不再需要校验了。
总的来说,权限系统采用非常复杂的结构效果未必理想。很多时候只是个管理模式的问题,应该尽量通过重新设计权限空间的结构来加以规避。不过在一些非常复杂的权限控制环境下,也许简单的描述信息确实很难有效的表达权限策略(虽然我从未遇到过),此时尝试一下规则引擎可能比在权限系统中强行塞入越来越多的约束要好的多
权限系统(4)--resource
权限管理中进行数据访问控制,其基本模式如下
operation target = selector(resource)
selector = user selector + auth filter
这里需要对resource的结构,以及选择算子的显式建模。selector必须允许权限系统追加filter,例如
IDataSource包中所使用的Query对象。
sql语言的表达能力有限, 作为选择算子来使用有时需要resource作一些结构上的调整,增加一些冗余的字段。例如表达一段时间内的利率,我们需要使用from_date和to_date两个字段来进行描述,其中to_date的值与下一条记录的from_date相同。
value from_date to_date
0.01 2003-01-01 2003-05-01
0.012 2003-05-01 2004-01-01
如果表达一条航线中的多个阶段,我们可能会在每条记录中增加起始站和终点站两个字段。
更重要的一个常见需求是树形结构在关系数据库中的表达。为了能够直接操纵一个分支下的所有记录,在层次固定的情况下,我们可能会增加多个分类字段,例如数据仓库中的层次维度。在层次数目不确定的情况下,我们将不得不使用层次码或者类似于url的其他方案,通过layer_code like '01.01.%' 之类的语句实现分支选择。为了限制选择的深度,我们可能还需要layer_level字段。基于层次码和层次数,我们可以建立多种选择算子,例如包含所有直接子节点,包含自身及所有父节点等等
动态权限最简单的一个表现是时限性,subject只在某个时间段内具有某种权限。这只需要在user和role的映射中,或者role自身的属性中增加startTime和expireTime即可。
更复杂的动态性一般与流程控制相关,此时权限控制应该由工作流系统完成,而不是在数据上增加越来越多的权限标记。在witrix平台中,使用tpl模板技术来定制权限设置。
分享到:
相关推荐
总之,基于角色的用户权限系统设计是现代企业信息系统中不可或缺的一部分,它有效地实现了权限管理和安全性控制。通过对角色、用户和权限的合理配置,可以构建出高效且安全的业务操作环境。在实际应用中,开发者需要...
权限系统设计是软件开发中的关键组成部分,主要用于控制不同用户对系统资源的访问和操作。本文主要探讨基于用户、角色、权限的设计思路,并提供一种实现方案。 首先,理解基本概念: 1. **权限**:权限定义了用户...
通用权限系统设计的难点在于如何满足不同系统对权限需求的多样性,同时又保持设计的灵活性和扩展性。 设计目标包括创建一个灵活、通用且方便的权限管理系统。系统中的资源分为静态资源和动态资源两类。静态资源主要...
权限系统设计思路 权限系统是一个非常重要的安全机制,在现代企业中扮演着至关重要的角色。权限系统的设计主要是为了限制用户的访问范围,防止未经授权的访问和操作。下面是权限系统设计思路的详细介绍: 一、权限...
通用权限系统设计旨在确保不同职责的用户在操作系统时拥有适当的操作权限,提高管理效率并确保系统安全性。在大型企业业务系统中,权限管理是至关重要的,因为它允许管理员批量分配权限,避免了为每个员工单独设置...
权限系统的核心由以下三部分构成:1.创造权限,2.分配权限,3.使用权限,然后,系统各部分的主要参与者对照如下:1.创造权限 - Creator创造,2.分配权限 - Administrator 分配,3.使用权限 - User:
权限系统设计是软件开发中一个关键的组成部分,用于确保用户只能访问他们被授权的数据和功能。以下是基于给定文件内容的详细阐述: 1. **基于角色的访问控制(RBAC - Role-Based Access Control)** 这是最常见的...
后台权限系统设计是软件开发中的重要组成部分,尤其在企业级应用和管理信息系统中起到关键作用。权限系统的主要目标是确保用户只能访问他们被授权的操作和数据,从而保护系统的安全性和完整性。以下是对后台权限系统...
【权限管理系统设计方案】是关于如何构建一个有效管理用户权限的系统的详细文档。权限设计的核心在于理解用户、组、角色和权限这四个基本概念及其相互关系。 1. **权限设计概念** - **权限资源**:权限资源是系统...
本项目是基于SpringBoot和Vue3的renren-security权限系统设计源码,包含511个文件,其中主要包含253个java源代码文件,49个vue前端文件,33个svg图片文件等。系统采用了SpringBoot、MyBatis-Plus、Shiro、Vue3、...
#### 系统设计原则 - **安全性**:确保系统的安全性是首要考虑的因素,需要采取多种措施防止未授权访问。 - **灵活性**:系统应能够适应组织结构的变化,支持动态调整部门和角色。 - **可扩展性**:随着企业规模的...
领域驱动设计(Domain-Driven Design,简称DDD)是一种软件开发方法,强调以业务领域为中心进行系统设计,将复杂的业务逻辑转化为清晰的模型。在“基于DDD领域驱动设计通用后台权限系统”中,我们首先需要理解DDD的...
- **设计目标**:权限系统旨在对应用系统的所有资源实施控制,涵盖功能菜单、界面按钮等,以满足不同用户需求。设计应具备通用性,以便在多种环境和开发语言中复用。 - **运行环境**:支持Windows和Linux操作...
2. **权限系统的可扩展性**: - 系统的权限管理模块应具备高度可扩展性,能够轻松集成到任何需要权限控制的系统中,就像一个可重用的组件。这样避免了在每次开发新系统时都需要重复设计权限管理功能。 3. **功能...
Java 权限管理系统数据库设计 ...权限管理系统数据库设计是指在 Java 平台下设计和实现的权限管理系统的数据库结构和设计思路,包括数据库表的设计、字段的设计、权限的设计、角色设计、用户设计等方面的内容。