我该如何在Web应用程序中实现访问控制列表(ACL)?

8

我一直在思考即将开始开发的Web应用程序,想知道是否可以改进我的通常方法。

在我的最近几个应用程序中,我创建了一个角色表(如下所示),其中每个角色都有一个位域应用于它们,因此我可以在注册时简单地分配用户特定的权限并在以后检查它们(例如:$user->hasRight(CREATE_POST))。

我在想是否有更好的方法。当权限没有明确链接到用户时,这肯定会让人感到困惑(我可以有一个表,其中每个权限都是一个布尔列,但这只听起来像是一个小的改进)-如果我改变了一些内容会发生什么?

我不打算使用标准库(应用程序本身是我的学习经验:使用postgresql、git等),尽管我非常乐意从中获得灵感来构建自己的库-所以如果您认为有特别的东西值得我去看,请告诉我 :)


此外,这将是一个用于PHP应用程序的实践,但如果在Ruby on Rails上有一个很好的做法,我相信我可以找出解决办法 :) - Ross
4个回答

5
您可以查看Spring Security(前身为Acegi)的文档,这是一个广泛使用的Java ACL框架。
该文档非常详尽,还描述了在机器人身份验证和授权设计中考虑到的各种因素。即使不使用Java,它也值得一读。
您可以查看索引页面来了解Acegi的概述和印象(以及不做什么)。您甚至可以直接跳转到授权概念数据库模式

Spring Security的网站布局已更改,以下是更新的链接列表:首页ACL概念schema - Attila Fulop

4
这基本上是我在自己的Web应用程序中采取的相同方法(我已经进行了一些试验和错误)。唯一的区别是,我可能会使用一个表格,将不同的权限作为列,这样如果您想稍后添加更多权限,就可以做到。在整数中使用位会限制您只能拥有固定数量的权限,即整数中的位数。通常这将是32,我想这可能足够了,但我不愿意以这种方式限制自己。
值得一提的是,phpBB也使用这种模型(将权限作为表格列),如果它足以成为最受欢迎的PHP Web应用程序,那么对您来说也足够好了;-)

1
我喜欢使用表格实现ACL的想法。你能告诉我如何正确设计以实现ACL吗?假设我们有一个与Drawing具有一对多关系的Project表和一个USER表。假设我们有项目AB,它们都有许多图纸。我该如何设计,以便允许1个用户仅查看A,1个用户仅查看B,而1个用户可以查看两者。 - Thang Pham

1

Web应用程序中的ACL方法通常已经讨论过,例如这里


请避免仅提供链接的答案。如果链接失效,则答案将无法使用。 - Ajay Naredla

1
我相信你已经找到了phpgacl,但是如果你还没有的话,这里有一个链接。起初理解可能有些困难,而且将该库实现到项目中也会比较棘手(耗时),但文档和演示都是非常好的参考点。

PHP通用访问控制列表


1
我之前没有看过,但它确实很有趣。 - Ross

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接