2009-10-12 2 views
2

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

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

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

класса PublicFeatures { общественности:

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

класса ProtectedFeatures: общественные PublicFeatures { общественности:

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

класса AdminFeatures: общественные ProtectedFeatures { общественности:

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

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

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

ответ

1

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

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

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

0

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

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

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

if (user.isAdministrator()) { 
    securityLogs.archiveAndDelete(); 
} 
else { 
    throw SecurityException("You can't do that!"); 
} 
+0

Это не вопрос пользователей. Речь идет о «предпочтительной рекламе» в отношении «глобальной рекламы». –

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