【问题标题】:Tricky class design issue棘手的类设计问题
【发布时间】:2011-04-22 23:28:35
【问题描述】:

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

例如:员工可以查看客户记录,但不能查看其他任何内容,雇主可以查看客户以及管理员工,管理员可以同时执行这些操作以及管理雇主。

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

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

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

    if ($permissions->can('addCustomer')) 回声“添加客户”; 别的 echo '不允许添加客户';

但棘手的部分是,在某些地方,我需要更具体。例如:客户已获得权限:readMsgs,允许他阅读自己与员工之间的消息。但是,如果他有该权限,那么他可以简单地将 url 更改为:

site.com/messages/read/100

site.com/messages/read/101

同时阅读第 101 条消息,该消息可能在另一位客户和员工之间。客户不应该能够阅读除他自己以外的任何人的消息。

同样,客户获得了editCustomer 权限,允许他通过以下方式编辑自己的个人资料:

site.com/customers/99

(其中 99 是他的客户 ID)

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

不应允许他访问该页面。

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

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

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

任何想法我必须如何重组我的班级结构以允许上述类型的事情?

【问题讨论】:

    标签: oop design-patterns class-design


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我会有一个带有canRead(User) 函数的消息类。这将检查用户的权限并说“哦,我是经理发给员工的消息。除非用户是消息的接收者,否则他们无法阅读它。”或者同样简单地“我是经理给员工的消息。用户是经理,所以他可以阅读。”

      我用英文打字是因为我很烂 php(这似乎是首选语言。)

      【讨论】:

      • 我知道 Java,如果这样更容易,请随意输入。但问题是,该类如何知道它是请求从员工 X 向客户 X 读取消息,还是请求编辑客户 X 的个人资料?在这两种情况下,一旦类知道它是哪一个,它就可以检查当前用户是否是客户 Y,在这种情况下,请求将被拒绝。
      • 我不确定我是否理解您后续问题的性质。你的请求怎么会不知道? messages/read/XYZ 非常清楚地定义了行为。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多