Я дивлюся на свій дизайн інтерфейсу, і я намагаюся вирішити, який є найбільш "правильним" способом здійснення управління доступом на основі ролі, з огляду на 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)
делегувати операцію a la:
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()
керування доступом, кидаючи виняток, коли користувач не має необхідного дозволу?
Що б вважалося "найкращою практикою" у цій ситуації? Де насправді повинна виникнути відповідальність за здійснення перевірок?
Оскільки це дещо як академічна вправа, яка згодом прогресує у впровадженні, посилання на моделі дизайну були б вдячні.