棘手的类设计问题

时间:2011-04-22 23:28:36

标签: oop design-patterns class-design

我正在努力实现一个用于在我的网站上管理用户权限的类。

例如:员工可以查看客户记录,但没有别的,雇主可以查看客户以及管理员工,管理员既可以做这些事情,也可以管理雇主。

到目前为止,我得到的是:

  • 我已经存储了一个权限列表,例如addCustomerdelCustomer等。每个权限都链接到允许执行该操作的用户角色列表。< / p>

  • 我已经构建了一个简单的权限类。我正在使用这样的东西:

    if($ permissions-&gt; can('addCustomer'))    回声“添加客户”; 其他    echo'不允许添加客户';

然而,棘手的部分是在某些地方,我需要更具体。例如:客户已获得权限:readMsgs,允许他阅读自己与员工之间的消息。但是,如果他有这个权限,那么他只需更改网址:

site.com/messages/read/100

site.com/messages/read/101

并阅读#101消息,这可能是另一位客户和员工之间的消息。除了他自己,客户不应该阅读任何人的消息。

同样,客户已获得editCustomer权限,允许他通过访问以下内容编辑自己的个人资料:

site.com/customers/99

(其中99是他的客户ID)

但如果他去     site.com/customers/100

不应该允许他访问该页面。

我该如何解决这个问题?理想情况下,我希望能够将id传递给权限类。 E.g:

if (! $permissions->can('readMsg', $msgId))
   echo 'not allowed';

if (! $permissions->can('editCustomer', $requestedCustomerId))
   echo 'not allowed';

我有什么想法,我必须重组我的类结构以允许上述类型的东西?

2 个答案:

答案 0 :(得分:1)

我会有一个带canRead(User)功能的消息类。这将检查用户的权限并说“哦,我是从经理到员工的消息。除非用户是收到消息的人,否则他们无法阅读。”或者同样容易“我是从经理到员工的消息。用户是经理,所以他可以阅读。”

我用英语输入它是因为我吸了一个php(这似乎是首选的语言。)

答案 1 :(得分:1)

我会更加细化我的权限分类(例如,“readOwnMsgs”与“readAnyMsg”)。这将详细说明您的权限检查代码(例如,site.com/messages/read/###类似于“如果canReadAnyMsg或如果canReadOwnMsg和消息作者是当前用户则继续”),表明此逻辑应该是封装在按资源类型划分的单独类中或任何其他情况可能会对做出此类决策所需的上下文信息产生影响。