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