Мы используем Spring Security с ролями и привилегиями вместе с Spring ACL.Интерфейс предоставлен Thymeleaf (версия 3).Пользователь приложения может иметь либо роль с разными привилегиями, либо прямой доступ к какому-либо объекту домена, установленному ACL.
В серверной части все работает как положено, но я не могу правильно написать sec: authorize в шаблоне Thymeleaf,который будет объединять hasAuthority () и hasPermission () в одном выражении.Пользователь может иметь разрешения уровня сущности для определенной роли или разрешения уровня экземпляра в Spring ACL.
Конкретный пример
У меня есть таблица, в которой отображаются объекты домена, защищенные ACL.Есть некоторые действия, которые я хотел бы ограничить с помощью sec: authorize, чтобы проверить, разрешено ли текущему пользователю выполнять это действие.
<th:block th:each="securedObject: ${securedObjects}">
<button sec:authorize="hasAuthority('DELETE') OR hasPermission(#securedObject,'ADMINISTRATION')">Delete object</button>
</th:block>
Однако оценка hasPermission по какой-то причине здесь не работает.Я просто не могу получить доступ к локальному защищенному объекту там.Безопасность ACL рассматривает это как нуль и запрещает доступ.Я попробовал его с другим синтаксисом (hasPermission ($ {securedObject}, 'ADMINISTRATION') и т. Д., Но безуспешно.
Интересно то, что он правильно работает с использованием sec: authorize-acl и правильно:
<button sec:authorize-acl="${securedObject} :: 'ADMINISTRATION'">
</button>
Однако при написании таким образом невозможно объединить его с разрешениями на уровне сущности (hasRole ()), поэтому:
<button sec:authorize-acl="${securedObject} :: 'ADMINISTRATION'" sec:authorize="hasRole('DELETE')">
</button>
создает логическое И между этимидва, так что пользователь должен иметь оба - доступ, предоставленный определенной ролью и ACL.