2016-01-23 45 views
1

我正在学习面向对象的设计,因为我经历了我的第一个真正的个人项目。在设计课程时,你如何处理子类型?

我在我要建立用户对象的阶段。我有4种用户亚型:

  1. 根管理员 - 站长,网站所有者
  2. 组管理员 - 用户 - 拥有会员和页面(如乐队经理)
  3. 组成员一组的领导者可以查看,填写,并在页面上组成员意见,并看到私密内容(如乐队成员)
  4. 无关联的用户 - 整个网站的成员可以查看和评论公开(如风扇)

所有的组管理员都将是组成员和所有组成员也将是无关联的用户。所以基本上它是一个简单的用户权限层次结构

这样说的话,我该如何去设置我的班级的架构呢?有嵌套技术吗?我只是在努力在这里拼凑脚手架。我已经写出了我的用例和叙述。

+0

在这种情况下,您应该考虑使用组合而不是子类型/继承。 – Rahul

+0

我正在阅读有关作文,并发现PHP只接受一位家长。有没有解决的办法? – Dexter

+0

我误解了我正在阅读的内容。对我来说太复杂了。为了我的目的,这可能会起作用。但是我正在阅读一篇关于为什么写作很糟糕的文章,我想我正在学习一些复杂的方法论,但没有准备好大声笑......我想从一开始就学会正确,但是我越过了我的头。 – Dexter

回答

3

所以你正在实施基于角色的访问控制。每个用户都有四个角色之一。所以用户是一个对象,用户的角色是用户对象中的一个属性。

enum roles { 
    root_admin, 
    group_admin, 
    group_member, 
    unassociated_user 
} 

class user { 
    string id; 
    roles role; 
} 

接下来,您需要强制执行允许特定角色的用户执行某些活动的业务规则。

开始用一个简单的解决方案(这始终是一个很好的策略):

enum activities { 
    view, 
    post, 
    add_comment 
} 

并实现了一个函数或类,他们的工作是说,如果一个活动是允许给定角色。

class role_based_access_control { 
private: 
     permissions perm; 
public: 
    bool is_permitted(activities a, roles r) { 
     return perm[r].contain(a); 
    } 
} 

然后,在你的代码中,你实现不同的活动场所,包括这个函数的调用:

void add_comment_to_page(user u, comment c, page p) { 
    if (!role_base_access_control.is_permitted(add_comment,u.role)) 
     throw "access_forbidden"; 
    ... 
} 

重要的是要保持集中,这样的基于角色的访问控制规则,他们可见,易于监视和审计。

+0

这很简单。非常感谢您花时间写出来。我能够在几秒钟内实现这一目标,并使我更好地理解了这一过程。问题,这种方法有没有任何安全问题? – Dexter

+1

我很高兴能帮上忙。总是存在安全问题,但是安全审查通常与系统的其他层次有关,这些超出了本讨论的范围,例如用户如何通过身份验证,通信是否加密以及谁可以访问哪些服务器。无论如何,最好总体了解RBAC的优缺点。您可以将其与ABAC进行对比(请参阅http://security.stackexchange.com/questions/37276/what-are-the-advantages-disadvantages-of-attribute-based-access-control)。 –

+0

我应该重复一遍,我用PHP编写,这里的答案是在C中给出的。我最初用PHP标记了这个,但是因为我很容易转换它,所以我没有考虑到断开连接直到标签被移除。 PHP中没有Emum声明,我不得不编写一个小的基本枚举类来扩展。如果您有能力添加扩展名,则可以使用SPLenum。无论如何,这种架构适用于任何语言,但实现可能需要一些解决方法,就像我的情况一样。 – Dexter