Web 应用程序中的访问控制

Access Control in a Web Application

我目前正在阅读很多有关访问控制的文章 possibilites/mechanisms,这些内容可用于保护应用程序或 Web 应用程序中的资源。那里有 ACL、RBAC、ABAC 和许多其他概念。

假设我已经开发了一个简单的网络服务,returns 知识库文章在像“/api/article”这样的路径上。 'controller' 连接到数据库并获取所有文章并将它们 return 存储为 XML 或 JSON。

现在我想控制数据库中的哪篇文章可供哪个用户或组访问。因此,例如,如果用户 'peter' 使用他的凭据访问路由 '/api/article',则网络服务应 return 仅对 'peter'.

可见的文章

我想使用 ACL 来控制每个 user/group 可以 read/write/delete 的内容。但是我不太明白的是:

在哪里实施访问控制?如果用户访问路由“/api/articles”并根据访问控制列表检查每条记录(这听起来不是很好的性能),我是否只获取控制器中的所有记录?或者有没有一种方法 'SELECT' 对数据库的语句只 return 该特定用户实际可以看到的记录?

我真的很努力地寻找有关该主题的更多信息,并且有很多关于不同访问控制机制的信息,但没有关于实际执行发生的位置和方式的信息......如果它出现,它甚至会变得更加复杂修改、删除等其他操作...

这真的是一个实施问题,每个人都按照自己的方式去做。它还取决于数据的性质,特别是您授权的大小(您是否有 5 个角色并且用户附加到他们,或者每个用户是否有一组他可以访问的特定文章,每个用户不同 - 例如)

如果您不想在控制器上进行处理,您可以将授权信息存储在您的数据库中,在 table 中,它将用户链接到一组知识库文章,或角色 (这将反映在文章中)。在这种情况下,您的 SELECT 查询将只传递经过身份验证的用户 ID。这就需要关系的维护是数据库做的,可能不是很明显。

或者,您可以将 ACL 存储在控制器上并从那里构建查询 - 针对特定文章或文章组。

获取所有文章并在控制器上检查它们不是一个好主意(正如您提到的),数据库的设计也可以避免此类问题。