基于用户的数据访问

时间:2013-11-25 21:02:22

标签: sql database postgresql authentication

我试图找到实现基于用户的数据访问的最佳方式。例如,假设我们有一家公司,其中包括首席执行官和不同的部门主管。数据库包含每个部门的财务状况,CEO可以查看所有部门的财务状况,而每个部门负责人只能查看与他/她部门相关的数据。

我使用的数据库是PostgreSQL,它还没有实现行级访问规则。

我想知道是否有一个可以用来实现这个的已知范例。我查看了RBAC,但这似乎对我的需求来说太复杂了。

有任何建议/评论吗?

埃利

2 个答案:

答案 0 :(得分:1)

Imo,访问控制在应用程序级别实现起来要方便得多。

尽管有其优点,但数据库级别(甚至是行级别)访问控制将不允许您轻松管理棘手的用例,例如:“允许经理的秘书伪装成这个任务子集的管理者,同时他下个月休息一周。“坚持使用它来防止应用程序的数据库用户破坏数据。

在应用程序级别,深入了解RBAC和ACL。有一些很好的实现,完成模式。例如:

http://symfony.com/doc/current/cookbook/security/acl.html

无论你采用哪种方法,我认为关键是拥有它,以便你可以使用观察者模式的一些变体(事件,过滤器,插件钩子,无论你喜欢的框架中调用它)来插入应用程序逻辑。这将允许您使用回调而不是模式的怪异来管理棘手的案例。

一些(色彩缤纷且有争议的)发言者更进一步:http://vimeo.com/2723800

答案 1 :(得分:0)

这是一个复杂的话题。我没有不加批评地认可Denis对基于应用程序的访问控制的建议,因为虽然它通常是放置它的正确位置,但并非总是如此。一旦使用基于应用程序的解决方案,您就会遇到通过应用程序的所有请求。问题在于,这是否是您想要进行的权衡,或者您是否希望在处理其他事情时保留规则。

PostgreSQL没有简单的基于行的访问控制,但是如果需要,还有足够的工具可以使某些东西工作。这并不简单,但它具有应用程序中立的优点。一个完整的解决方案超出了任何一个帖子的范围,但这里有一些潜在的想法:

  1. 安全屏障视图(您可以使用触发器来管理更新)
  2. pg_has_role()
  3. 现在,与Denis上面的回答有什么共同之处在于,您不只是在表格上实现这一点,而是在数据处理层中实现。问题是该层放置在数据库连接的哪一侧,仅此而已。那里的需求取决于您希望强制执行所有访问的位置。