5

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

很长一段时间以来, php gacl一直是我的首选库,用于处理 Health IT 系统中非常复杂的 ACL 控制问题。但我现在更多地使用一般的 javascript 和专门的节点。我已经在 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 检查功能的文件。

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

在更深层次上,我想了解成功使用了哪些方法来处理这个问题。这个问题通常是如何解决的?对于那些根据节点/javascript甚至可能甚至是特定的数据库方法(关系与非关系)有效讨论此问题的人的奖励积分。我知道做这个正确/错误有很多理论基础(即对 RBAC 和 ACL 有很多意见)。我想要的是理论上可靠的东西,或者从图书馆的角度来看仍然“正常工作”的几乎可靠的东西。我专注于 Javascript,但很高兴了解其他语言实际上是如何解决这个问题的。

4

1 回答 1

3

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

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

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

我会将 Spring Security 和 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 问题和解决方案的 GOOD 描述,并且是为 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

于 2013-01-01T09:08:39.763 回答