Для реализации элементов управления авторизацией в методах Java я настоятельно рекомендую Spring Security с расширяемым языком разметки контроля доступа (XACML) , который имеет Spring Security API.
Spring Security
Spring Security предоставляет два основных средства защиты доступа к методам:
- Предварительная авторизация : это позволяет определенным условиям / ограничениям
проверяться до того, как выполнение метода разрешено. Неспособность
проверить эти условия приведет к невозможности вызова
способ.
- Поставторизация : это позволяет при определенных условиях / ограничениях
проверяться после возврата метода. Это используется реже, что
предварительная проверка, но может использоваться для обеспечения дополнительной безопасности
вокруг сложных взаимосвязанных методов бизнес-уровня, особенно
вокруг ограничений, связанных с объектом, возвращаемым методом.
Скажем, например, что одно из правил управления доступом заключается в том, что у пользователя есть полномочия ROLE_ADMIN, прежде чем он сможет вызвать метод getEvents (). Способ сделать это в среде Spring Security - использовать аннотацию PreAuthorize, как показано ниже:
public interface Sample { ...
@PostAuthorize("hasRole('ROLE_ADMIN')")
Event getEvent(); }
По сути, Spring Security использует точку запуска AOP, которая выполняется перед советом по методу, и выдает o.s.s.access.AccessDeniedException
, если указанные ограничения безопасности не выполнены.
Подробнее об уровне безопасности Spring Security см. В разделе 27.3 этой документации .
Расширяемый язык разметки контроля доступа (XACML) - язык политики для ABAC
Spring Security отлично справляется с реализацией контроля доступа с помощью управления доступом на основе выражений, но управление доступом на основе атрибутов (ABAC) обеспечивает более детальный контроль доступа и рекомендуется Национальным институтом стандартов и технологий.
Чтобы устранить ограничения управления доступом на основе ролей (RBAC), NIST разработал новую модель под названием ABAC (управление доступом на основе атрибутов). В ABAC теперь вы можете использовать больше метаданных / параметров. Вы можете, например, рассмотреть:
- личность пользователя, роль, должность, место, отдел, дата
рождение ...
тип ресурса, местоположение, владелец, стоимость, отдел ...
контекстная информация, например, время суток действия пользователя
попытка на ресурсе
Все это называется атрибутами. Атрибуты являются основой ABAC, отсюда и название. Вы можете собрать эти атрибуты в политики. Политика немного похожа на секретный соус ABAC. Политики могут предоставлять и запрещать доступ. Например:
- Сотрудник может просматривать запись, если сотрудник и запись находятся в одном регионе
- Запретить доступ к чтению записей с 5 вечера до 8 утра.
Политики могут использоваться для выражения сложных сценариев, например,
- разделение обязанностей
- ограничения на основе времени (см. Выше)
- управление доступом на основе отношений (см. Выше)
- правила делегирования делегируют Бобу доступ к документу Алисы.
Для написания политик доступно 2 основных синтаксиса:
ABAC также поставляется с архитектурой, определяющей, как политики будут оцениваться и применяться.
Архитектура содержит следующие компоненты:
Точка исполнения политики (PEP): это компонент, который
защищает API / приложение, которое вы хотите защитить. ПКП перехватывает
поток, анализирует его и отправляет запрос на авторизацию в PDP
(увидеть ниже). Затем он получает решение (Permit / Deny), которое он
навязывает.
Точка принятия решения о политике (PDP) получает запрос на авторизацию
(например, может ли Алиса просмотреть запись # 123?) и сравнить ее с набором
политик, с которыми он был настроен. В конечном итоге достигает
решение, которое он отправляет обратно в PEP. Во время оценки
В процессе PDP могут потребоваться дополнительные метаданные, например, работа пользователя
заглавие. Для этого он может обратиться к пунктам информации о политике (PIP)
- Информационная точка политики (PIP) является интерфейсом между PDP
и основные источники данных, например, LDAP, база данных, служба REST
которые содержат метаданные о пользователях, ресурсах или других. Ты можешь использовать
PIP для получения информации, которая может понадобиться PDP во время выполнения, например риск
оценка, местоположение записи или другое.
Реализации XACML
Полное раскрытие - я работаю в Техническом комитете XACML и работаю для Axiomatics , поставщика динамической авторизации, реализующего XACML.
Axiomatics предоставляет Spring Security SDK для своего Axiomatics Policy Server и предоставляет четыре выражения, которые можно использовать для запроса PDP в качестве части защиты вызова метода
- xacmlDecisionPreAuthz, вызывается с
@PreAuthorize
- xacmlDecisionPostAuthz, вызывается с
@PostAuthorize
- xacmlDecisionPreFilter, вызывается с
@PostFilter
- xacmlDecisionPostFilter, вызывается с
@PreFilter
Точные подписи для этих методов следующие:
xacmlDecisionPreAuthz(Collection<String> attributeCats,
Collection<String> attributeTypes, Collection<String> attributeIds,
ArrayList<Object> attributeValues)
xacmlDecisionPostAuthz(Collection<String> attributeCats,
Collection<String> attributeTypes, Collection<String> attributeIds,
ArrayList<Object> attributeValues)
xacmlDecisionPreFilter(Collection<String> attributeCats, Collection<String>
attributeTypes, Collection<String> attributeIds, ArrayList<Object>
attributeValues)
xacmlDecisionPostFilter (Collection<String>
attributeCats, Collection<String> attributeTypes, Collection<String>
attributeIds, ArrayList<Object> attributeValues)
Полный список реализаций XACML можно проверить в Википедии .