??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
]]>
]]>
]]>
几乎在所有的pȝ中对于权限控刉有直接的需求,而这c需求往往有其怼性,l合常见的对于权限系l的需求构成了本文档,文档主要从功能复用以及模型复用的角度来对权限pȝq行ȝQ以便在各种pȝ中可对照此篇文档来进行权限系l的实现Q考虑到文档的x点在复用度,在文档中不会q多的去描述功能点到模型产生的过E,而是采用直接通过产生的模型来说明Z此模型如何实现功能点的需求?/SPAN>
? 功能复用
功能复用相当于此权限模型适合的上下文场景Q此权限模型在功能点斚w的考虑主要有以下三个方面:
n Z角色的用户安全管?/SPAN>
pȝ权限以角色ؓ基础Q即以角色来q行权限的分配以及授予,角色分配l用户以使用户可获取相应的权限,角色通过授予权限来获得该角色所对应拥有的权限?/SPAN>
角色的权限可l承Q即子角色自动承父角色的权限?/SPAN>
权限的包含与排斥Q包含D例来说就是权?/SPAN>A可包含权?/SPAN>BQ体现出来即为拥有权?/SPAN>A卌动拥有了权限BQ而排斥D例来说就是角色不可同时拥有权?/SPAN>A和权?/SPAN>B?/SPAN>
n pȝ资源(功能模块)操作的控?/SPAN>
pȝ资源操作的控制在pȝ上主要分Z个方面:
l 正常途径pȝ资源操作的控?/SPAN>
体现在实际的需求上通常是菜单、按钮、链接根据用h在角色的权限的可见性?/SPAN>
l 非法途径pȝ资源操作的控?/SPAN>
体现在实际的需求上是防止通过非法?/SPAN>URL或命令等方式对系l受保护的系l资源进行操作?/SPAN>
n 数据资源操作的控?/SPAN>
数据资源操作的控制在pȝ中实际的体现通常是用户只能访问相应数据资源操作权限范围内的数据,如在一个站点中有栏?/SPAN>A?/SPAN>B?/SPAN>CQ用?/SPAN>M只拥有对A的访问权限以及对B的管理权限,那么在用?/SPAN>M讉Kpȝ时站点中应该只列出栏?/SPAN>A和栏?/SPAN>BQ同时在栏目B上拥有相应的理按钮或链接?/SPAN>
数据资源也需要支持权限承的模式Q即当数据资源本w构成了需要承的父子关系Ӟ子自动拥有父的所有权限,举例来说是站点和栏目,栏目自动拥有站点的所有权限?/SPAN>
数据资源的权限也是需要有包含和排斥的支持?/SPAN>
数据资源操作权限的授予通常需要的授予l多U对象,如用戗角色以及组l机构等?/SPAN>
? 模型复用
对于以上的功能点Q提Z相应的解x案构成如下模型:
n Z角色的用户安全管?/SPAN>
ZRBAC构成实现功能点的模型Q如下:
图表 1 ZRBAC的系l资源权限模?SPAN lang=EN-US>
Z此模型对当前需求的实现Ҏ(gu)为:
l 权限的授?/SPAN>
在权限授予时需要实现的为维护用户与角色的关联模型以及角色与权限的关联模型?/SPAN>
同时需要的是资源以及操作的l护Q资源上配置的主要ؓ功能模块的一些相关信息,如名U、描q等Q操作上配置的主要ؓ功能模块所需要受控的操作Q如对功能模块的讉K、保存动作等Q此处的关键在于配置操作所对应的命令,?/SPAN>B/S体系中通常?/SPAN>URLQ在C/S体系中有可能?/SPAN>Command或其他的入口关键字?/SPAN>
l 角色权限的?/SPAN>
角色权限的扉K过角色的子兌来实玎ͼ遵@的原则ؓ子角色自动拥有父角色的所有权限,在进行授权动作时所需要做的是l护角色父子关系兌模型?/SPAN>
l 权限的包含与排斥
权限的包含通过权限的子兌来实玎ͼ遵@的原则ؓ父自动拥有子的概念,在进行授权动作时所需做的是维护权限的父子关系兌模型?/SPAN>
权限的排斥在此模型中没有考虑?/SPAN>
n pȝ资源(功能模块)操作的控?/SPAN>
pȝ资源操作的控制基于图?/SPAN>1的模型而得以实现?/SPAN>
l 正常途径pȝ资源操作的控?/SPAN>
此时通常的做法是在菜单、按钮、链接这些显CZ前做对应的资源操作权限的判断?/SPAN>
判断的方法ؓ获取用户所在的角色Q判断用戯色是否有q行资源操作的权?/SPAN>(同时需判断权限的包含的问题)Q如无则递规获取用户角色的父角色是否有进行资源操作的权限?/SPAN>
l 非法途径pȝ资源操作的控?/SPAN>
对于非法途径对系l资源操作的讉KQ通常的实现方法ؓ在具体的对象执行前做截断处理Q通常采用Proxy?/SPAN>Interceptor模式?/SPAN>
n 数据资源操作的控?/SPAN>
数据资源操作的控制则难以Z上面的权限模型进行实玎ͼ需要对其进行扩展,产生的实现需求的模型为:
图表 2 数据资源权限模型
Z此模型对于数据资源操作的控制的实C要在两个斚wQ?/SPAN>
l 数据资源操作权限的授?/SPAN>
在进行数据资源操作权限的授予时维护权限授予模型,同时需要根据数据资源操作权限的授予同步校验权限模型(此时需要考虑权限的ѝ包含的问题)?/SPAN>
l 数据资源操作权限的校?/SPAN>
校验旉过校验权限模型卛_完成?/SPAN>
? 问题
在文中提及的权限模型实可以实现功能需求,但其在开发过E中以及应用q程中通常有这L问题Q?/SPAN>
n pȝ资源操作控制时权限校验的低效
通常的解x案是cache机制?/SPAN>
n 数据资源操作权限授予的低?/SPAN>
n 权限pȝ对于原有pȝ的R入?/SPAN>
通常的解x案有Proxy?/SPAN>Interceptor?/SPAN>AOP?/SPAN>
ps: q篇相对于我之前的O谈权限系l系列的文章来说相当于只是个抽取和归UI详细的还是得看那个系列的几篇文章?/P>
对开源的产品了解不多Q所以也只能大概的谈谈,开源的产品中比较知名的?/SPAN>poweracl?/SPAN>acegiQ?/SPAN>poweracl从名字就可以看出其是ZACL模型的,不怎么了解所以在此也不去评h(hun)了?/SPAN>
Acegi作ؓJAVA界知名的权限pȝQ从其文档看来是能满上q的权限pȝ的所有需求,?/SPAN>reference文档也对权限pȝq行了系l的归纳Q非常的不错Q徏议去看看?/SPAN>
?/SPAN>Acegi中授权模型以及资源权限的校验仍然是基?/SPAN>RBAC模型Q在数据权限斚w也就是在reference文档中它UCؓDomain Object Instance的部分,是基?/SPAN>ACL模型的实玎ͼ曄阅它此部分的代码,Ҏ(gu)代码表现它ƈ不支?/SPAN>Domain Object Instance的权限的l承Qƈ且对于获取的Domain Object Instance也是没法采用分页的方式获取?/SPAN>
看了Acegi的代码觉得其授权应该是比较高效的Q但在校验权限上效率恐怕也会比较的低,因ؓ权限的承是在校验权限通过递规来实现的Q虽然引入了~存机制但仍然无法从Ҏ(gu)上解x问题Q而且此缓存的l护也不是一件容易的事?/SPAN>
?/SPAN>Acegi的优点也不可忽略Q作为权限系l有一个很Ҏ(gu)产生的问题就是对原有pȝ产生非常大的侵入Qƈ最l导致原有系l与此权限系lŞ成了非常强的耦合Q?/SPAN>Acegi在这点上则做的比较好Q通过使用Filter?/SPAN>Interceptor以及AOP Weaver技术来量保证对原有系l最的改动?/SPAN>
? 个h观点
权限pȝ作ؓ各种pȝ中都需要的一个子pȝQ具有很q的需求面Q无论做什么系l,首要重要的仍然是需求,管权限pȝ在各个系l中都有需求,但仍然是不尽相同Q所以首先要明确所面对的系l到底是一个什么样的系l,对于权限有什么样的需求,Ҏ(gu)需求可以根据相应的实现Ҏ(gu)来做q设计?/SPAN>
权限pȝ主要由授权和校验权限两大部分l成Q授权效率和校验权限的效率通常会生冲H,个h觉得首先要保证校验权限的效率Q毕竟系l需要校验权限的地方会非常的多,但授权动作相Ҏ(gu)讲触发的会比较的?/SPAN>
从技术需求上来讲Q权限系l对外部pȝ而言最好做到黑盒的效果Qؓ了减对外部pȝ的R入,在根据业务需求分析的基础上Ş成权限系l的输入和输出需求,从通常的功能需求角度来大致的阐qͼ
1. w䆾认证
?/SPAN>B/Sl构的系l中通常通过增加Filter来达到实现n份认证的功能Q这样不会造成对原有系l的改动?/SPAN>
2. 授权模型
授权模型则需外部pȝҎ(gu)此模型徏立相应的授权UI以及交互Q当Ӟ权限pȝ本n也可提供默认的实现方式?/SPAN>
3. 资源权限校验
在资源权限的校验上可通过Proxy?/SPAN>Before Interceptor的方式来做到对资源操作的权限控制?/SPAN>
4. 数据权限校验
在很多时候需要区分好数据权限和业务逻辑Q不要将业务逻辑形式的数据控制也借用数据权限来实玎ͼ数据权限的引入很Ҏ(gu)对现有的pȝ模块造成影响Q在此块的设计上要特别注意避免造成对原有系l模块过多的侵入?/SPAN>
5. 权限校验的体?/SPAN>
在权限校验的体现上基本主要是表现在菜单、按钮以及数据的昄上,菜单、按钮通常通过标签的方式来控制Q数据的昄控制则需l合数据权限校验部分来实现?/SPAN>
到现在ؓ止也做了几个权限pȝ了,目前仍然没做自己满意的权限系l,此文作ؓ抛砖引玉的文章,也希望大家能够给己所做的解决Ҏ(gu)?/SPAN>
? 涉及的知识体p?/SPAN>
Ҏ(gu)上面的描qC及结合自ql验QŞ成搭建权限系l所需的知识体p:
图表 6 权限pȝ知识体系
本文Ҏ(gu)对中型应用pȝ的权限系l的需求进行阐qͼq对通常用于实现权限pȝ的两U思想、技术策略以及技术实现方案进行描qͼ比较其优~点Q同时对开源类型的产品q行介绍Q最后结合自q实际l验介绍自己的实现方案以及碰到的隄?/SPAN>
本文q不是什么理论化的文章,完全是实战型的ȝ和实战的讨论Q至于理大家d考更Z业的文章?/SPAN>
? 目的
此文的编写作己对于权限系l进行系l化的整理,毕竟权限pȝ是几乎所有系l中都需要的Q但一直以来由于在权限pȝ上ƈ没有什么通用的方案,所以几乎是N多的人都实现了自q一套,在此我也是抛砖引玉?/SPAN>
? 需?/SPAN>
3.1. 描述
q里对于需求的描述都是Z自己工作以来实际目需求的l验而综合的Q如有遗漏之处欢q大家补充,不过也希望大家明白范_是指中小型系l,至于大型的企业系l从来就没做q,我也无从提出需求?/SPAN>
从一个实际的场景来描qC般中型pȝ中涉及的权限需求吧Q在通常?/SPAN>B/Spȝ中,首页列出不需d可访问的信息Q登录后则根据用h有的权限昄相应的菜单,在具体菜单对应的模块里根据用L权限昄相应权限的按钮,同时昄当前用户可访问的相应的资源?/SPAN>
非功能性的需求:
l 便的授权方式。避免每增加一个用户就要不断的L?/SPAN>N多的权限Q避免相同权限的用户q要ȝ同的授予Q提供出分组的功能?/SPAN>
l 权限的ѝ在上面提出分组的功能后考虑到组应支持嵌套功能,卛_l自动承父l的权限Q这h权时更加简便了?/SPAN>
l 高性能。不能因为校验权限而严重媄响到pȝ的性能?/SPAN>
l 安全性。除正常途径方式讉Kpȝ的保护外Q也需要避免通过非正常的途径讉Kpȝ中受保护的资源?/SPAN>
除了q些用户通常直接提出的需求外Q在实际的项目中通常q会有这些需求:
l 权限的排斥和包含。用户在实际的用后通常会提个需求,权限的排斥主要是指当用户拥有权限A时则不能同时再拥有权?/SPAN>BQ这个在实现了权限承的pȝ中尤为突出;权限的包含主要指当用h有权?/SPAN>A时自动拥有了权限BQ实际的例子是当用户拥有理权限时自动同时拥有访问权限?/SPAN>
l pȝ资源权限的ѝ在对带有分U性质的资源进行授权时子资源自动承父资源的权限,q个在文档管理类型的pȝ中比较常见,即目录中的文档自动拥有目录的权限?/SPAN>
l pȝ资源权限的多U授予对象。通常pȝ的权限是授予到角色中Q而对于系l资源的权限授予上用户在使用后通常会提出需要授予到多种对象Q除角色之外q需可授予给l织机构或者具体的用户?/SPAN>
3.2. 分析
寚w求中列出的场景进行分析:
l 上下?/SPAN>
未登录用戗登录用戗管理用户不同的界面{情c?/SPAN>
l 问题
如何识别是否为登录用戗管理用h未登录用戗?/SPAN>
l 解决Ҏ(gu)
提供w䆾认证功能Q通过此功能标识用戯n份?/SPAN>
l 上下?/SPAN>
Ҏ(gu)用户拥有的权限显C相应的菜单Q在具体菜单对应的模块里Ҏ(gu)用户的权限显C相应权限的按钮?/SPAN>
l 问题
׃菜单或者按钮都是通过触发链接或命令的方式来实现其功能Q那么在权限pȝ中需要做到的卛_通过判断用户是否h执行此链接或命o的权限来实现对于菜单和按钮的昄的控制?/SPAN>
q样带来的问题就是如何判断用h否拥有执行某链接或命令的权限以及如何Ҏ(gu)此结果去隐藏菜单和按钮的昄?/SPAN>
l 解决Ҏ(gu)
提供校验用户是否拥有执行某链接和命o的权限的功能?/SPAN>
提供控制菜单、按钮显C的功能?/SPAN>
l 上下?/SPAN>
昄当前用户可访问的相应的资源,有两U情况,一U是全部昄Q一U是分页昄?/SPAN>
l 问题
如何判断用户可访问哪些资源,资源如何q行分页处理?/SPAN>
l 解决Ҏ(gu)
提供获取用户权限范围内的资源的功能,q提供全部获取和分页获取两种方式?/SPAN>
l 上下?/SPAN>
便的授权方式?/SPAN>
l 问题
为提升用h权的便性,权限授予给角色或组Q用户只需要属于这个角色或l即可拥有相应的权限?/SPAN>
如何建立满需求的授权模型?/SPAN>
l 解决Ҏ(gu)
Ҏ(gu)需求徏立相应的授权模型?/SPAN>
Ҏ(gu)寚w求的分析Q可以得出权限系l需要做到如下的功能Q?/SPAN>
l 用户w䆾认证?/SPAN>
l 校验用户是否拥有执行某链接和命o的权限的功能?/SPAN>
l 控制菜单、按钮显C的功能?/SPAN>
l 获取用户权限范围内的资源的功能,q提供全部获取和分页获取两种方式?/SPAN>
l 建立相应的授权模型?/SPAN>
在非功能性需求方面权限系l需要考虑如下几个斚wQ?/SPAN>
l 权限的ѝ?/SPAN>
l 权限的排斥和包含?/SPAN>
l 高性能?/SPAN>
l 安全性?/SPAN>
l pȝ数据的权限的l承?/SPAN>
l pȝ数据的多U授权对象的支持?/SPAN>
Ҏ(gu)q些Ҏ(gu)限系l的功能需求和非功能性需求,我们可以合ƈ和归Ux如下的一个表g为对权限pȝ的需求:
功能?/SPAN> |
描述 |
w䆾认证 |
提供用户w䆾认证的功能,以标识用h否登录、是否ؓ理员等w䆾?/SPAN> |
资源权限校验 |
判断操作M是否hҎ(gu)资源q行某操作的权限?/SPAN> |
数据权限校验 |
获取用户权限范围内的数据的功能,q提供全部获取和分页获取两种方式?/SPAN> pȝ数据的权限的l承?/SPAN> pȝ数据的多U授权对象的支持?/SPAN> |
授权模型 |
pȝ权限的授予模型决定了权限pȝ使用的易用与否?/SPAN> 权限的ѝ?/SPAN> 权限的排斥和包含?/SPAN> |
权限校验的体?/SPAN> |
控制菜单、按钮的昄?/SPAN> |
高性能 |
高效的授权与高效的权限校验?/SPAN> |
安全?/SPAN> |
防止非法途径对于pȝ受保护资源的讉K或操作?/SPAN> |
一. 概述
? 目的
? 需?/SPAN>
3.1. 描述
3.2. 分析
? 实现Ҏ(gu)
4.1. 技术策?/SPAN>
4.2. ZRBAC的实?/SPAN>
4.2.1. RBAC介绍
4.2.2. 实现Ҏ(gu)
4.2.3. 优缺点分?/SPAN>
4.3. ZACL的实?/SPAN>
4.3.1. ACL介绍
4.3.2. 实现Ҏ(gu)
4.3.3. 优缺点分?/SPAN>
? 开源?/SPAN>
? 个h观点
psQ不q最q的工作非常的忙Q这文档的q度可能会写的比较的慢,^_^