2016-01-23 2 views
1

Я изучаю объектно-ориентированный дизайн, поскольку я просматриваю свой первый реальный, хотя и персональный проект.При разработке классов, как вы относитесь к подтипам?

Я нахожусь на этапе, когда я собираюсь создать пользовательский объект. У меня есть 4 подтипа пользователя:

  1. корневого администратор - веб-мастер, владелец сайта
  2. группа админы - лидер группы, который имеет членство и страницу (например, менеджер группы)
  3. группы членов - пользователь который может просматривать, создавать сообщения и комментарии в качестве члена группы на странице и посмотреть, личное содержание (например, член группы)
  4. несвязанных пользователь - член всего сайта, которые могут просматривать и комментировать публично (например, вентилятор)

Все администраторы группы будут группами члены и все члены группы также будут не связаны с пользователями. Таким образом, в основном это простая иерархия разрешений пользователей.

С учетом сказанного, как мне настроить архитектуру моего класса в отношении этих уровней? Существует ли техника гнездования? Я просто борюсь за то, чтобы вывесить здесь леса. У меня есть мои варианты использования и выписанные нарративы.

+0

В этом случае вам следует рассмотреть возможность использования композиции вместо подпечатывания/наследования. – Rahul

+0

Я читал о составе и узнал, что PHP принимает только одного родителя. Есть ли способ обойти это? – Dexter

+0

Я неправильно понял, что я читал. Это становится слишком сложным для меня. Для моих целей это может сработать. Но я читаю статью о том, почему состав плохой, и я думаю, что у меня сложная методология, которая не готова к LOL ... Я хочу узнать это правильно, с самого начала, но я получаю моя голова. – 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

Смежные вопросы