Я смотрю на свой дизайн интерфейса и изо всех сил пытаюсь решить, какой самый «правильный» способ реализовать управление доступом на основе ролей, учитывая, что userи к subjectкоторому userхотел бы получить доступ.
Насколько я вижу, у меня есть три основных варианта (четвертый - бастардизация первых трех, а пятый - подстройка четвертого):
- Запрос
subjectсо списком разрешений, которыеuserимеет -subject.allowAccess(user.getPermissionSet) - Запрос
userсо списком разрешений, которыеsubjectтребуются -user.hasPermissionTo(subject.getRequiredPermissions()) - Запрос стороннего, чтобы найти пересечения разрешений -
accessController.doPermissionSetsIntersect(subject.permissionSet, user.getPermissionSet()) - Запросить либо
subject/user, делегируя «решение» стороннему классу - Иметь
userпопытку доступа кsubjectи выдаст ошибку , если доступ не разрешен
Я склоняюсь к четвертому варианту: « subjectСодержать accessControllerполе, в котором содержатся вызовы для subject.userMayAccess(User user)делегирования операции а-ля:
class Subject {
public function display(user) {
if(!accessController.doPermissionSetsIntersect(this.permissionSet, user.getPermissionSet())) {
display403(); //Or other.. eg, throw an error..
}
}
}
.. но тогда это вызывает дополнительные вопросы:
- должно
accessControllerбыть поле против статического класса ..? - Должен ли
subjectзнать, какие разрешения требуются для его просмотра? - где здесь действует принцип наименьшего знания в отношении призвания
subject.display()? Должны ли абонентыsubject.display()когда-либо знать, что контроль доступа действует? (гдеsubject.display()последний "шаблонный метод") - есть
subject.display()управление доступом, выдавая исключение, когда у пользователя нет необходимых разрешений?
Что будет считаться «лучшей практикой» в этой ситуации? Где должна быть ответственность за выполнение проверок?
Так как это в некоторой степени и академическое упражнение, которое затем перейдет к реализации, ссылки на шаблоны проектирования приветствуются.