Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 在设计类时,如何处理子类型?_Oop_Architecture - Fatal编程技术网

Oop 在设计类时,如何处理子类型?

Oop 在设计类时,如何处理子类型?,oop,architecture,Oop,Architecture,我正在学习面向对象设计,这是我的第一个真实的,尽管是个人的项目 我正处于构建用户对象的阶段。我有4个用户子类型: 根管理员-网站管理员、网站所有者 组管理员-具有成员资格和页面的组的组长(例如乐队经理) 组成员-可以作为组成员在页面上查看、发布和评论并查看私人内容的用户(例如,乐队成员) 非关联用户-整个网站的成员,可以公开查看和评论(如fan) 所有组管理员都将是组成员,所有组成员也将是非关联用户。所以基本上它是一个简单的用户权限层次结构 话虽如此,我该如何着手建立与这些级别相关的类架构?有筑

我正在学习面向对象设计,这是我的第一个真实的,尽管是个人的项目

我正处于构建用户对象的阶段。我有4个用户子类型:

  • 根管理员-网站管理员、网站所有者
  • 组管理员-具有成员资格和页面的组的组长(例如乐队经理)
  • 组成员-可以作为组成员在页面上查看、发布和评论并查看私人内容的用户(例如,乐队成员)
  • 非关联用户-整个网站的成员,可以公开查看和评论(如fan)
  • 所有组管理员都将是组成员,所有组成员也将是非关联用户。所以基本上它是一个简单的用户权限层次结构


    话虽如此,我该如何着手建立与这些级别相关的类架构?有筑巢技术吗?我只是努力在这里搭建脚手架。我已经写出了我的用例和叙述。

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

    enum roles {
       root_admin,
       group_admin,
       group_member,
       unassociated_user
    }
    
    class user {
       string id;
       roles role;
    }
    
    接下来,您需要强制执行允许特定角色的用户执行特定活动的业务规则

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

    并实现一个函数或类,其任务是说明给定角色是否允许某个活动

    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";
       ... 
    }
    

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

    在这种情况下,您应该考虑使用构造函数而不是子类型/继承。我正在阅读构图,发现PHP只接受一个父节点。有办法吗?我误解了我所读的内容。这对我来说太复杂了。就我而言,这可能有效。但我正在读一篇关于为什么构图不好的文章,我想我正在进入一个复杂的方法论,还没有准备好lol。。。我想从一开始就把它学好,但现在我已经想得太多了。这很简单。非常感谢您抽出时间写下这篇文章。我能够在几秒钟内实现这一点,这让我对这个过程有了更好的理解。问题,这种方法是否存在安全问题?我很高兴能提供帮助。始终存在安全问题,但安全审查通常会涉及超出本讨论范围的系统的其他层,例如用户如何进行身份验证、通信是否加密、谁有权访问哪些服务器。在任何情况下,了解RBAC的优缺点都是很好的。您可以将其与ABAC进行对比(请参阅)。我可能应该重复一下,我是用PHP编写的,这里给出的答案是关于C的。我最初用PHP对其进行了标记,但因为我可以轻松地将其转置,所以在移除标记之前,我没有考虑断开连接。PHP中没有Emum声明,我必须编写一个小的基本枚举类来扩展。如果您能够添加扩展,那么可以使用SPLenum。无论如何,这种体系结构适用于任何语言,但实现可能需要一些变通方法,就像我的例子一样。
    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";
       ... 
    }