Когда следует использовать Spring ACL безопасности в моем приложении?

Spring Security ACL выглядит очень мощным и простым в использовании, когда вы можете придерживаться своей реализации. Однако, похоже, он становится намного сложнее, когда вам нужно реализовать свои собственные Acl и AclService (см., Например, этот (старый) очень простой учебник только ~ 26 страниц), и кажется трудно найти ссылки и примеры для него (этот учебник был с 2008 года).

В нашем приложении, например, пользователи имеют роли и принадлежат отделам. В большинстве случаев им разрешено выполнять некоторые операции над объектами, принадлежащими их департаменту, на основе их ролей. Во всех случаях роль отдела + достаточно, чтобы решить, должен ли пользователь предоставлять конкретную операцию для определенного объекта.

Пользователи, роли и отделы управляются внешним приложением, из которого мы извлекаем их, когда пользователь подключается (мы используем службы REST, но он также может быть сервером LDAP).

Мы хотели бы положиться на @PreAuthorize('hasPermission(…)') для реализации защиты объектов домена. Таким образом, доступны 2 решения:

  • Внедрить пользовательский PermissionEvaluator, который выполняет все проверки; или
  • Внедрить ACL с пользовательским AclService, который строит структуру объекта, необходимую для нормальной работы ACL.

Кажется, что реализация целого AclService будет сложнее и сложнее, чем реализация PermissionEvaluator, но ACL выглядит более стандартным.

На основании каких критериев вы должны реализовать один или другой?

Ответ 1

PermissionEvaluator отвечает за оценку выражения, чтобы определить, имеет ли пользователь разрешение для данного объекта домена. С другой стороны, AclService предоставляет интерфейс для извлечения экземпляров Acl. В духе Разделение проблем каждый компонент затрагивает отдельную проблему.

Если какая-либо реализация PermissionEvaluator должна выполнять оценку на основе экземпляров Acl, она должна делегировать AclService для их извлечения. Фактически AclPermissionEvaluator делает именно это.

Я предлагаю вам пойти этим путем. Отдельная оценка из списка ACL. Если концепция Spring AclService и Acl слишком сложна или сложна для вашего варианта использования, вы можете представить свою собственную службу для получения пользовательского ACL. Затем выполните PermissionEvaluator, который будет делегировать вашу службу ACL.

На самом деле, мне нужно было сделать что-то подобное, потому что мне нужно было хранить списки ACL в базе данных NoSQL, а какие Spring - не работали для меня.

Я бы сказал, что это все усилия, необходимые для настройки Spring ACL для удовлетворения ваших требований и усилий по внедрению пользовательского решения. Если ваши требования могут быть удовлетворены реализацией ACL по умолчанию Spring, пойдите для этого. Это, безусловно, сэкономит ваше время для реализации вашего пользовательского решения. Однако, если невозможно адаптировать Spring ACL к вашим требованиям или это будет слишком сложно, тогда вам может быть проще реализовать свое пользовательское решение.