高级访问控制库


Advanced Access Control Libraries

我对为用户执行高级访问控制以访问软件系统中的资源感兴趣。我在医疗保健IT行业工作,年轻时经常低估医疗保健中基于角色的访问控制的复杂性。但是这个问题应该适用于任何具有复杂ACL需求的人。

很长一段时间以来,php gacl一直是我处理医疗IT系统中非常复杂的ACL控制问题的首选库。但我现在更多地使用javascript,特别是node。我在npm中搜索了库,以一种通用的方式进行访问控制。

我希望支持定义操作,而不仅仅是用户和资源(3层而不是2层),我希望有用户、操作和资源组,并且暗示我希望有ACL继承。

从《星球大战》主题手册到该库的经典示例是如下规则:

  • 所有船员都有(访问,配置和使用)访问权限炮台,引擎,座舱和休息室,都准备好了。
  • 所有机器人都有(访问和使用)进入驾驶舱,但只有R2D2有配置对引擎的访问。
  • Han拥有所有类型的访问权限

这里的基本概念包括您可以制定适用于任何一组用户的规则(即:机组人员,乘客或机器人)或个人(Han和Chewie),您可以对不同的资源(发动机和驾驶舱)有不同类型的访问(访问,配置,使用)或访问组(维护访问=配置+修理+使用),这些资源也可以分组(战斗站=驾驶舱+枪支)。

这允许使用相对简单的基于组的管理来配置非常复杂的访问控制规则。

到目前为止,我还没有在php-gacl之外看到类似的内容。我看过一些很棒的基于javascript的ACL项目,它们都标榜简单易用,而不是全面性。对于其他典型的php ACL库(如Zend ACL)也是如此

有人在一个"高级ACL"项目为节点工作吗?也许有更好的方法,我应该在哪里寻找?

php-gacl包含三个部分,一个是基于php的管理GUI(无可否认过于复杂),一个用于规则CRUD的API(我认为可以很容易地转换为REST接口)和一个非常小的文件,提供ACL检查功能。

从技术上讲,只有最后一种类型需要完全移植到节点上才能使该软件模型工作?

在更深的层次上,我想了解已经成功地使用了哪些方法来处理这个问题。这个问题通常是如何解决的?对于那些从node/javascript甚至特定数据库方法(关系vs非关系)的角度有效讨论这个问题的人来说,这是加分项。我知道做这个对/错有很多理论基础(即关于RBAC和ACL的很多意见)。我想要的是理论上可靠的东西,或者几乎可靠的东西,从图书馆的角度来看,它仍然"正常工作"。我关注的是Javascript,但了解其他语言如何实际解决这个问题会很好。

如果您可以避免使用任何类型的ACL,您通常会更好。它们管理起来很复杂。您最好将安全检查分为三个级别:

  1. URL/IP地址/或其他接入点安全检查
  2. 资源检查时的方法。无论你想修改或操纵什么实体,你都要对其进行权限检查。例如,业务规则访问类型。
  3. 实体资源检查。如果一个用户/API/OAuth令牌可以访问一个实体

这可以使用RBAC来完成。您的组织/站点的每个角色都被分配了一组访问/修改/操作权限。用户被分配了一个角色,但是三个级别的检查检查的是PERMISSIONS,而不是角色。

我会把Spring安全和RBAC看作是谷歌搜索,并以此为模型。以下是我发现的一些有用的链接:

http://www.xaprb.com/blog/2006/08/16/how-to-build-role-based-access-control-in-sql/

http://www.xaprb.com/blog/2006/08/18/role-based-access-control-in-sql-part-2/

(因为Spring Security中所有的'原始'示例和疯狂命名的检查,建议您阅读提供Spring权限'hasRole()'检查的替代名称和用法的文章。)下面的文章将在RBAC的设计中讨论这一点

http://springinpractice.com/2010/10/27/quick-tip-spring-security-role-based-authorization-and-permissions/

(Spring Security的灵活使用,包括RBAC)

http://www.infoq.com/presentations/Spring-Security-3

(下面给出了RBAC问题和解决方案的一个很好的描述,并且是为PHP设计的)

http://www.tonymarston.net/php-mysql/role-based-access-control.html

带有RBAC实现的PHP框架:

http://trac.symfony-project.org/wiki/UserRbac

最后是Spring Security的类图。您将注意到,它允许将安全信息放入到被保护实体的PARALLEL表中。这是经过设计的,因此Spring Security可以在以后添加、取出或替换。但这也意味着更多的表。

http://code.google.com/p/uclm-esi-alarcos/source/browse/trunk/documentation/memoria-pfc/Figuras/Cap5/spring-security-class-diagram.png?r=295