Рассмотрим (из https://www.owasp.org/index.php/Access_Control_Cheat_Sheet):
if (AC.hasAccess(ARTICLE_EDIT)) {
//execute activity
}
Это правильно подразумевает, что контроль доступа
… политика сохраняется / централизована в некотором роде
Мой вопрос о том, как лучше всего это централизовать.
Я могу придумать один очевидный способ — включить в класс все действия, требующие контроля доступа, — жесткое кодирование. Я могу просто вызвать метод hasAccess(ARTICLE_EDIT)
в этом классе. Это подразумевает, что всякий раз, когда действие добавляется в приложение, мне нужно добавить его в класс.
Другим способом централизованного контроля доступа может быть включение контролируемых действий в мою базу данных. Каждый раз, когда мне нужно проверить доступ, я звоню hasAccess(ARTICLE_EDIT)
и это вызовет вызов в мою базу данных. Я бы включил этот метод в модель контроля доступа.
Во-первых, я правильный путь, пожалуйста? Есть ли другие решения, которые люди предпочитают? Каковы могут быть преимущества / проблемы решений, пожалуйста?
Вы столкнулись с проблемой «внешнего контроля доступа». Здорово, что вы подумали об отделении бизнес-логики от логики авторизации. Теперь вам нужен способ выразить свою логику авторизации.
Существует стандарт для этого, называемый XACML, расширяемый язык разметки контроля доступа:
Пример политики выглядит следующим образом с использованием нотации XACML ALFA:
namespace example{
policy article{
target clause itemType=="article"apply firstApplicable
rule editArticle{
target clause actionId == "edit" and userRole == "editor"permit
condition userId == owner
}
}
}
Других решений пока нет …