2011-04-22 101 views
0

我正在实施一个类来管理我的网站上的用户权限。棘手的类设计问题

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

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

  • 我已经存储的权限列表,如addCustomerdelCustomer等每个权限被链接到用户角色的列表,它被允许执行该操作。

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

    if($ permissions-> can('addCustomer')) echo“Add Customer”; else 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传递给权限类。例如:

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

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

任何想法我将不得不重构我的类结构以允许上述类型的东西?

回答

1

我会更精细的在我的权限的分类(例如,“readOwnMsgs”与“readAnyMsg”)。这会详细说明你的权限检查代码(例如,site.com/messages/read/###会沿着“如果canReadAnyMsg或canReadOwnMsg和消息作者是当前用户的情况下继续”)行,则表明这个逻辑应该是封装在按资源类型细分的不同类别中,或者任何其他情况可能对作出此类决策所需的上下文信息有影响。

1

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

我在英文打字出来,因为我吸了PHP(这似乎是选择的语言。)

+0

我知道Java,所以随时输入,如果那会更容易。但问题是,班级如何知道它是否要求从员工X读取消息给客户X,或者是否要求编辑客户X的个人资料?在这两种情况下,一旦类知道它是哪一个,它就可以检查当前用户是否是客户Y,在这种情况下请求将被拒绝。 – 2011-04-23 00:20:50

+0

我不确定我是否了解后续问题的性质。你的请求如何不知道? 'messages/read/XYZ'很清楚地定义了行为。 – corsiKa 2011-04-23 01:41:37