Контроль доступа к объектам

Возможно ли ограничить функциональность класса только определенными объектами (в C ++). Это означало бы, что в классе 10 методов, а в этом классе 10 объектов. Возможно ли, чтобы object1 и object2 имели доступ только к 3 функциям. Объект3, объект4, объект5, объект6 имеют доступ к 6 функциям. а остальные объекты получают доступ ко всем функциям?

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

Одним из подходов является использование наследования, что-то вроде этого:

Класс PublicFeatures {public:

// добавить несколько методов здесь; };

Класс ProtectedFeatures: public PublicFeatures {public:

// добавить еще несколько методов здесь; };

Класс AdminFeatures: public ProtectedFeatures {public:

// добавить остальные методы сюда; };

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

Можно ли сделать такую ​​вещь? или я должен следовать другому подходу для реализации контроля доступа?

2 c++
12.10.2009 22:16:55
2 ОТВЕТА
РЕШЕНИЕ

Насколько я знаю, нет. Это, однако, часть исследования аспектно-ориентированного программирования. В этой книге я увидел нечто похожее на то, что вам нужно: Aspect Oriented Software Development .

Основная проблема, с которой вы сталкиваетесь, - это отсутствие знаний о том, кто является вызывающим абонентом вашей функции. Вы могли бы обойтись, потребовав от каждого вызывающего абонента вызывать методы вашего объекта, передавая thisформу аутентификации о себе. Далеко не идеально, но с этим решением вы можете обернуть каждый метод в предварительный метод, выполняющий ACL.

Другой альтернативой было бы объявить ваш класс реализации полностью закрытым с точки зрения методов и определить класс «bodyguard», объявленный другом первого. Класс bodyguard выполняет вызовы от имени вызывающего абонента (который является единственным уполномоченным сделать из-за объявления друга). У вас все еще есть проблема аутентификации, и вы в основном оборачиваете весь целевой класс за его объектом bodyguard.

1
12.10.2009 22:21:18

Уровни доступа членов класса на самом деле не имеют никакого отношения к пользователям и ограничениям безопасности. Они на самом деле просто кодируют конструкции, а не то, что вы можете использовать во время выполнения. Компилятор либо разрешит, либо запретит вам вызывать функцию при компиляции вашего кода. Если она компилируется, ваша программа может быть запущена, иначе нет. Нет никакого осмысленного способа добавить какие-либо условия или логику приложения.

Но я думаю, что у меня есть только один класс, и он каким-то образом ограничивает доступ к некоторым методам для этого конкретного объекта.

Да, это то, что вы должны сделать. Язык не поможет, но вы можете сами охранять вызовы методов. Например, даже не пытайтесь вызвать административный метод, если пользователь не является администратором.

if (user.isAdministrator()) {
    securityLogs.archiveAndDelete();
}
else {
    throw SecurityException("You can't do that!");
}
0
12.10.2009 22:26:59
Это не вопрос пользователей. Это вопрос «предпочтительной гласности» в отношении «глобальной гласности».
Stefano Borini 12.10.2009 22:28:19