Контроль доступа — кодирование деятельности

Рассмотрим (из https://www.owasp.org/index.php/Access_Control_Cheat_Sheet):

if (AC.hasAccess(ARTICLE_EDIT)) {
//execute activity
}

Это правильно подразумевает, что контроль доступа

… политика сохраняется / централизована в некотором роде

Мой вопрос о том, как лучше всего это централизовать.

Я могу придумать один очевидный способ — включить в класс все действия, требующие контроля доступа, — жесткое кодирование. Я могу просто вызвать метод hasAccess(ARTICLE_EDIT) в этом классе. Это подразумевает, что всякий раз, когда действие добавляется в приложение, мне нужно добавить его в класс.

Другим способом централизованного контроля доступа может быть включение контролируемых действий в мою базу данных. Каждый раз, когда мне нужно проверить доступ, я звоню hasAccess(ARTICLE_EDIT) и это вызовет вызов в мою базу данных. Я бы включил этот метод в модель контроля доступа.

Во-первых, я правильный путь, пожалуйста? Есть ли другие решения, которые люди предпочитают? Каковы могут быть преимущества / проблемы решений, пожалуйста?

0

Решение

Вы столкнулись с проблемой «внешнего контроля доступа». Здорово, что вы подумали об отделении бизнес-логики от логики авторизации. Теперь вам нужен способ выразить свою логику авторизации.

Существует стандарт для этого, называемый 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
}
}
}
1

Другие решения

Других решений пока нет …