我目前正在阅读很多关于可用于保护应用程序或Web应用程序中的资源的访问控制可能性/机制。那里有ACL,RBAC,ABAC和许多其他概念。
假设我开发了一个简单的Web服务,可以在类似' / api / article'的路由上返回知识库文章。 '控制器'连接到数据库并获取所有文章并将它们作为XML或JSON返回。
现在,我想控制哪个用户或组可以访问数据库中的哪篇文章。因此,例如,如果用户' peter'访问路线' / api / article'凭借他的凭据,网络服务应仅返回对“彼得”可见的文章。
我想使用ACL来控制每个用户/组可以读/写/删除的内容。但我不太明白:
在哪里强制执行访问控制?如果用户访问路线' / api / articles'我是否只是获取控制器中的所有记录?并根据访问控制列表检查每个单个记录(这听起来不是很好的性能)?或者有没有办法选择' SELECT'对数据库的语句只返回该特定用户实际可以看到的记录吗?
我真的很努力地找到关于该主题的更多信息,并且有很多关于不同的访问控制机制,但不是关于实际执行的地点和方式......如果实际执行的话,它甚至会变得更复杂它涉及其他行为,如修改,删除等......
答案 0 :(得分:2)
这实际上是一个实施问题,每个人都以自己的方式行事。它还取决于数据的性质,特别是您的授权大小(您是否有5个角色和用户是否附加到他们或每个用户是否拥有他可以访问的特定文章集,例如每个用户不同 - 例如)
如果您不想在控制器上进行处理,您可以将授权信息存储在数据库中,将用户链接到一组知识库文章或角色的表中(然后将反映在文章)。在这种情况下,您的SELECT查询将只传递经过身份验证的用户ID。这要求维护关系是由数据库完成的,这可能并不明显。
或者,您可以将ACL存储在控制器上并从那里构建查询 - 针对特定文章或文章组。
获取所有文章并在控制器上检查它们并不是一个好主意(正如您所提到的),DB的设计也是为了避免此类问题。