Диалект безопасности тимелистного листа - hasPermission () - PullRequest
0 голосов
/ 13 июня 2018

Мы используем 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.

1 Ответ

0 голосов
/ 14 июня 2018

Я наконец смог заставить его работать.К объекту домена в итерации можно получить доступ с помощью следующего выражения:

 <div sec:authorize="hasPermission(#vars.securedObject,'ADMINISTRATION')">Delete</div>

Однако оценщик разрешений по-прежнему отказывал в доступе к объекту.Также необходимо настроить его в классе конфигурации Spring Security следующим образом:

  @Configuration
  public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

        @Autowired
        private PermissionEvaluator permissionEvaluator;

        @Override
        public void configure(WebSecurity web) throws Exception {
           DefaultWebSecurityExpressionHandler handler = new 
           DefaultWebSecurityExpressionHandler();
           handler.setPermissionEvaluator(permissionEv);
           web.expressionHandler(handler);
         }

         @Override
         protected void configure(HttpSecurity http) throws Exception {
         ....
}
...