`
metadmin
  • 浏览: 167884 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

讨论《细粒度的Action实现系统权限》帖子

阅读更多

<!-- [if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:PunctuationKerning/> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:Compatibility> <w:SpaceForUL/> <w:BalanceSingleByteDoubleByteWidth/> <w:DoNotLeaveBackslashAlone/> <w:ULTrailSpace/> <w:DoNotExpandShiftReturn/> <w:AdjustLineHeightInTable/> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:UseFELayout/> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> </xml><![endif]--> <!-- [if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman";} table.MsoTableGrid {mso-style-name:网格型; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; border:solid windowtext 1.0pt; mso-border-alt:solid windowtext .5pt; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-border-insideh:.5pt solid windowtext; mso-border-insidev:.5pt solid windowtext; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.0pt; font-family:"Times New Roman";} </style> <![endif]-->

讨论《细粒度的 Action 实现系统权限》帖子

 

 

帖子地址: http://www.iteye.com/topic/10400?page=1

 

关键字: Action ,细粒度权限,实例权限, Module RBAC queryString Acigi Voter

 

引题

Struts WebWork 这样的系统中,会按照每个细粒度功能定义 Action 。比如:

客体(资源)

Action

功能

用户

ListUserAction

查询用户

RemoveUserAction

删除用户

ModifyUserAction

修改用户信息

CreateUserAction

添加用户

 

看!这样 Action 就相当于客户(资源)+操作了!!!

Action 使用 RBAC 策略,就可以控制某些用户能增、删、改和查,而另一些却只能查、改等等权限。

eway 说“笔者 eway 已经在一个小项目中采用了这个办法,效果还好。不妨试试,说不定收到意象不到的好处。”

讨论

定义 Module 抽象层

robbin 说“用户管理功能可能要对应六七个相关的 Action…… 所以我觉得在 Action 上面再抽象出来一层 Module ,针对 Module 设置权限比较好。”

分组概念

jjw 说道“ 分组概念 ( 分组也是一棵树,用户就是这里的叶子 )
只有角色是不够的, B 公司发现 A 有财务问题成立了一个财务调查小组 , 然后我们赋予了这个小组财务调查员的角色 ( 注意是赋予小组这个角色 ). 这样这个小组的所有人员
都有财务调查的资格。而不需要给小组的每个人都赋予这个角色 ( 实际上已经拥有了 ) ,分组概念也适合部门,因为任何一个部门在公司里或者社会上都在扮演着一个泛的角色。”

定义接口,注入 SecurityService

思想如下:需要权限判断的 Action ,必须实现 Protected ,以便和不需要权限判断的 Action 区别开。 Protected 定义了权限判断方法, Action 必须实现该方法。

 

权限判断执行过程由:拦截器完成。拦截器拦截 Action ,对实现 Protected 接口的 Action 进行判断。而具体判断逻辑由 Action 定义的。

 

下面,继续研究一下: Action 如何实现权限判断逻辑。

有这样一个服务: SecurityService 含有方法: boolean hasPermission( User user, String someTokenString )

所以 Action 里面的权限判断几乎是 Delegate SecurityService SecurityService 可以使用动态注入的方式,达到可替换 SecurityService 的实现模式。

 

QuakeWang 继续给出了“更细粒度的控制,或者是一些特殊逻辑权限检查”。这些手段直接在 Action 里面编码。比如:

 

!group.getName();.equals("ADMIN_GROUP"); && securityService.hasPermission(RemoteUser.get();, "maintain_group");; 
 

 

queryString 是否属于权限控制范围

eway 说“我怎么觉得诸如 queryString 之类的权限控制不应在权限系统实现,基本上是个业务实现的问题。我觉得这个 queryString 往往是代表了 什么情况下 这个权限有效的问题,如果都考虑进入权限系统的话,权限系统会非常庞大,难以维护。这种权限生效的 “situation” 的问题,我往往做到 业务逻辑层中去 check 。”

eway 继续说“偶还是觉得用 资源 + 操作 去思考权限的粒度比较合适?比这个粒度粗的权限,就用角色来实现,比这个粒度细的权限就用业务实现。这样权限系统比较适中。”

 

jackyz 举例说明“如果要精确控制 , 必须要在比 Action 更细的层次做 . 举例来说 :
论坛的帖子显示界面 , 如果当前用户对当前帖子 有删除权限 , 则显示删除链接 . 否则 , 就不显示 .
当前的操作 (Action) 是显示帖子 , 但是显示链接的逻辑判断需要对另外一个功能 ( 删除功能 ) 进行判断 . 这个判断是业务的必须 , 没有办法省略 .

 

ruby 说这样会导致 Action 不纯粹。 ruby 说“如果这样来写 ACTION, Action 也太不 " 纯粹 " , 包含了太多和当前 action 无关的逻辑 , 既然是要进行界面元素的显示控制 , 就在界面上控制 好了 , 比如用 taglib, 至于权限列表 , 保存在 session, 显示界面元素时时取出对比一下 , 有此权限就显示此界面元素 , 没有就不显示 .

 

jackyz 指出确实不纯粹,但确实有必要,而且还提出了“权限引擎” 概念。他说“确实不纯粹 . 但是 , 对于实例级别的权限控制 , 似乎没有更好的办法 .

首先 , 明确一下 . 这里的需求是 : 实例级的权限控制 ( 就是控制到谁对什么资源 [ 的哪一个实例 ] 具有什么操作 ). 而不是功能级的权限控制 ( 就是控制到谁对什么资源 [ 不管哪一个实例都 ] 具有什么操作 ).
实例级的权限控制 , 比如 ,A 用户可以删除 A 帖子 , 但不能删除 B 帖子 . 它与具体资源的实例相关 .
功能级的权限控制 , 比如 ,A 用户可以删除帖子 (A 用户具有删除帖子的权限 , 不管什么帖子 ). 它与具体资源的实例无关 .
功能级的权限控制 , 与用户和资源类型相关 , 对于特定的用户来说 , 枚举资源类型得到的列表是确定的 , 确实可以用 Session 保存列表 , 在显示逻辑中处理 . 但是 , 实例级的权限控制 , 与具体的实例相关 , 对特定的用户 , 不可能枚举所有资源的实例 .

这种情况下 , 只有 Action 的处理过程本身能够确定对于特定实例 (ArticleId=xxx) 做出权限判断 .

从另一个角度来看 , 这里的 Action 实际上是一个 " 交互层 ", , 它服务于显示逻辑 , 显示逻辑需要一个 " 是否可以删除 " 的属性 , 那么它就应该提供 , 不管是从 Session 来取 . 还是从权限引擎来运算 , 这是另外一个问题 .

 

后来又引入了 Acegi ,先按下不表,稍后再议。

权限控制切入点

仅仅在 url 层进行控制显然不够,因为这样可以采用手工输入 url 地址来侵入系统。即便模仿“ C/S ”风格,不显示地址栏也不行。地址栏用户还是可以调出来的。

所以不仅要控制前台显示“链接”,“按钮”等要素,还要对后台方法进行拦截,做权限判断。

 

nihongye 引入 Acegi ,她 [ 不知道是否为女士,我根据头像判断的 ] 说道“如 acegi: 权限控制可以分前后两部分来做 . 前的可以基于 url 来做 . 后的基于方法拦截来做 . 前后的结合通过 runAsManager 来做到 . 例子就是里面的 contact. 后台的可以定义粗粒度的控制资源 , 前台再细化 . 并且分开开发 , 保证前后台的开发无关 .

nihongye 继续谈了 Voter acegi 提供了可配置的 voter, 一个验证请求交由多个 voter 进行处理 , 已经提供了 roleVoter. 可以加入自定义的 voter 来处理 .

 

按照角色判断,可以由 roleVoter 验证,还可以自定义自己的 Voter Spring 应该还定义了其他一些 Voter ,以方便开发者。

 

其他观点

还有其他一些观点,我没有领悟到要领,在此不表。抱歉!

 

分析

相关定义

(仅供参考,选自 XACML http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=xacml

Resource (资源) - Data, service or system component

Subject (主体) - An actor whose attributes may be referenced by a predicate

XACML 规范非常牛气,也很强大。 Oracle Entitlement Server 遵守了这个规范。

 

我们一般称呼请求者为“用户”,规范里面称呼为“主体”。“主体”可以是用户、程序、计算机等。

“资源”大多情况下是我们指的数据、服务或者某个应用组件。

细粒度属于权限

细粒度,帖子里面也被称为对一个“实例”的权限。 XACML整个规范围绕细粒度权限展开的。

我也认为这是属于权限范畴。举例来说:用户只能编辑自己发出的帖子;版主可以编辑自己管理版面的任何帖子。

这就涉及到权限判断啊。当然属于权限领域。只是目前大多系统没有好的模型来控制这件事情,采用硬编码罢了。

 

当然,细粒度权限和业务逻辑紧密关联。但仍然应该隶属于权限范畴。

权限分类

目前我们遇到如下需求了:

<!-- [if !supportLists]-->1.         <!-- [endif]-->界面哪些功能菜单要显示出来;

<!-- [if !supportLists]-->2.         <!-- [endif]-->调用 Action url 需要再次判断用户功能权限;

<!-- [if !supportLists]-->3.         <!-- [endif]-->界面哪些按钮要显示出来,哪些链接要显示出来;

<!-- [if !supportLists]-->4.         <!-- [endif]-->调用后台某方法,需要先做权限判断;

<!-- [if !supportLists]-->5.         <!-- [endif]-->细粒度权限, queryString 等如何判断;

<!-- [if !supportLists]-->6.         <!-- [endif]-->界面比如某个下拉框显示内容,如何取出。比如机构下拉框,总公司用户登录,机构下拉框显示各个分公司机构;分公司用户登录,下拉框显示本分公司下属机构。

 

综上,可以将权限分为:

<!-- [if !supportLists]-->1.         <!-- [endif]-->功能级权限, url,action, 菜单隶属此类 ;

<!-- [if !supportLists]-->2.         <!-- [endif]-->细粒度权限,这个又可以分为:

<!-- [if !supportLists]-->a)         <!-- [endif]-->决策权限,比如某用户(按照规范称为主体)请求删除某条数据,应该做出权限判断,是否允许该用户删除。界面按钮、链接是否显示属于此类,调用后台方法(如删除客户资料方法)也隶属此类。

<!-- [if !supportLists]-->b)        <!-- [endif]-->查询权限。界面显示下拉框内容,查询数据都属于此类。系统应该返回某用户(主体)具有权限查看的数据有哪些。比如,总公司人员登录,返回分公司列表,以便前台页面展示到下拉框;分公司人员登录,返回本分公司下属机构类别,以便前台页面展示到下拉框。

 

业内产品、规范

业内最牛气的规范,是 XACML eXtensible Access Control Markup Language )。

(http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=xacml

 

国际产品:

Oracle Entitlement Server

http://www.oracle.com/technology/products/id_mgmt/oes/htdocs/fov_entitlements_server.html 并购 BEA 后,属于 Oracle 了。很强大的哦。

  IBM Tivoli Access Manager

http://www-01.ibm.com/software/tivoli/products/access-mgr-e-bus/

本土产品:

Metadmin Access Manager (效方为安,北京)

http://www.metadmin.com

开源社区产品: Spring Security (源于 Acegi )。

http://static.springframework.org/spring-security/site/

 

Oracle IBM 产品,采用 Policy 策略,设置细粒度权限策略。由权限服务器集中管理,可以为多个分散系统管理权限。只提供决策权限授权。有管理界面。

Metadmin 产品,也采用 Policy 策略,设置细粒度权限策略。目前以中间件模式集成到应用系统,提供权限服务。提供决策权限和查询权限两种权限授权。设置权限策略,完全界面化,无需编码和 XML 配置。

 

Spring Security 我只了解皮毛,少讲一些免得引起误解) Spring Security 提供了框架,开发人员可能需要自己定制 Voter ,还要书写大量的 XML 配置文件。( Spring 的配置文件,确实。。。。。。)

权限应该在哪层进行控制

为了达到统一和让系统简化的目的,在 Control 层控制最佳。最好可以将权限设计成中间件,可以在需要的时候,通过 API 调用。

 

(这篇文章够长的了,下次再写吧。欢迎大家讨论。)

 

作者简介:汪金保,从事权限领域开发有 5 年。目前在北京效方为安信息技术有限公司担任首席架构师职务。可以使用电子邮件 wangjbao@gmail.com 与我联系。

 

欢迎转载,转载请注明出处。

 

分享到:
评论

相关推荐

    基于SpringBoot+shiro实现数据库的细粒度动态权限管理系统

    基于SpringBoot+shiro实现数据库的细粒度动态权限管理系统 项目经过严格测试,确保可以运行!源码无需做任何更改! 基于SpringBoot+shiro实现数据库的细粒度动态权限管理系统 项目经过严格测试,确保可以运行!...

    java的细粒度权限和shiro权限校验 ssh

    在Java开发中,细粒度权限管理是一种重要的安全机制,它允许系统对用户访问资源进行精确控制,确保每个用户只能操作他们被授权的部分。Shiro是Apache组织提供的一款强大且易用的Java安全框架,它提供了身份认证、...

    Android平台细粒度权限管理系统的研究与实现.pdf

    知识点一:Android平台的安全机制概述 ...通过以上的知识点阐述,我们可以了解到Android平台细粒度权限管理系统的研究与实现的重要性和紧迫性,以及为了提高Android系统的安全性,对权限管理机制进行深入研究的必要性。

    基于RBAC模型的细粒度权限控制

    这种设计使得权限控制更加细致,可以实现细粒度的访问控制,同时保持系统的扩展性和灵活性。 PDES平台的RBAC系统遵循了上述原则,为每个功能模块定义了资源和操作,用户通过被指派的角色来执行操作。这样的设计不仅...

    基于python的细粒度情感分析设计与实现

    在这个基于Python的项目中,我们将探讨如何设计和实现一个高效的情感分析系统,涵盖了从数据预处理到模型训练和评估的全过程。 首先,我们要理解情感分析的基本概念。情感分析通常分为极性分析(正面、负面、中性)...

    基于python实现的细粒度情感分析:细粒度情感分析接口

    【作品名称】:基于python实现的细粒度情感分析:细粒度情感分析接口 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:...

    python实现的细粒度情感分析:细粒度情感分析接口(源码+详细文档说明)

    python实现的细粒度情感分析:细粒度情感分析接口(源码+详细文档说明)python实现的细粒度情感分析:细粒度情感分析接口(源码+详细文档说明)python实现的细粒度情感分析:细粒度情感分析接口(源码+详细文档说明...

    权限控制之粗粒度与细粒度概念及实现简单介绍

    权限控制之粗粒度与细粒度概念及实现简单介绍 权限控制是信息安全中的一种重要机制,主要用于控制用户对资源的访问权限。权限控制可以分为两种类型:粗粒度权限控制和细粒度权限控制。 粗粒度权限控制是指对资源...

    细粒度位置追踪

    FINE框架的独特之处在于,它结合了CP-ABE、转换键和代理重加密技术,首次在LBS系统中实现了位置隐私、LBS数据和数据访问政策的保密,无需可信第三方,并提供了细粒度访问控制。此外,它特别适合移动设备使用,因为它...

    基于Spring Security的细粒度权限管理系统设计源码

    这是一个基于Spring Security框架的细粒度权限管理系统,使用Java语言开发,同时包含JavaScript、CSS、HTML等多种编程语言。该项目共包含2447个文件,其中主要文件类型包括JavaScript、PNG图片、CSS、HTML、JAR包、...

    使用 Springboot 实现的基于数据库细粒度动态权限管理系统.zip

    这是一个基于Springboot框架实现的细粒度动态权限管理系统。该系统设计的核心目标是提供高度灵活且可扩展的权限控制机制,使系统管理员可以根据用户角色、资源以及操作来精确分配权限。下面将详细介绍这个系统的实现...

    电力系统实时仿真中细粒度并行实现.pdf

    总结起来,这篇研究展示了如何通过FPGA实现电力系统实时仿真的细粒度并行化,这种方法提高了仿真效率,降低了通信开销,并且已经在实际的IEEE-14电力系统仿真中得到了验证。这种方法对于推动智能电网中复杂控制设备...

    细粒度管理Linux文件系统.pdf

    在Linux操作系统中,文件系统的细粒度管理是确保系统安全性和用户隐私的关键环节。传统的Linux文件系统访问控制机制基于UGO(用户-用户组-其他用户)模型,这种模型简单易懂,但有时不能满足复杂的权限管理需求。从...

    DroidDefence:细粒度的Android应用权限管理系统.pdf

    DroidDefence:细粒度的Android应用权限管理系统.pdf

    使用SpringBoot与shiro实现基于数据库的细粒度动态权限管理系统实例.zip

    本实例“使用SpringBoot与shiro实现基于数据库的细粒度动态权限管理系统”旨在提供一个可扩展且灵活的解决方案,以满足各种应用场景下的权限管理需求。 SpringBoot是一个快速开发框架,它简化了Spring应用的初始...

    动态代理加注解实现细粒度的权限管理,具体到方法

    总的来说,通过动态代理和注解的结合,我们可以方便地实现细粒度的权限管理,不仅提高了代码的可读性和可维护性,还使得权限控制逻辑与业务逻辑相分离,降低了系统的复杂性。这种方式在大型系统中尤为适用,例如在...

Global site tag (gtag.js) - Google Analytics