Spring Security «Роли» и «Привилегии» и Thymeleaf «hasRole» и «hasAuthority» - PullRequest
0 голосов
/ 08 мая 2018

Используя этот подход, у меня были некоторые проблемы с Front-End (Thymeleaf). Пример:

  • У пользователя есть роль admin (роли назначены две привилегии read и write)
  • Пользователь имеет роль user (роли назначается только с привилегией read)

В Front-End я буду защищать различные div s. Если я войду с admin:

<li sec:authorize="hasRole('admin')">Entry 1</li>
<li sec:authorize="hasAnyRole('admin', 'user')">Entry 2</li>

ничего не показывает, а

<li sec:authorize="hasAuthority('read')">Entry 3</li>
<li sec:authorize="hasAnyAuthority('read', 'write')">Entry 4</li>

отлично работает.

Теперь, когда я использую role в качестве контейнера для своего privileges, нет ли способа разрешить доступ к div для "целого" role? Я действительно должен перечислить все privileges? Или я здесь что-то путаю? Спасибо.

Основная идея:

  • user1

    with Role 'admin'
    
            with Privilege 'read' / 'write'
    
  • user2

    with Role 'user'
    
            with Privilege 'read'
    

И в тимелист:

Отображение div для всех пользователей с ролью администратора с

<li sec:authorize="hasRole('ROLE_ADMIN')">Entry 1</li>

и отображение div для всех видов использования с правами записи с

<li sec:authorize="hasAuthority('READ_PRIVILEGE')">Entry 1</li>

Это вообще возможно / 'путь?' Я имею в виду смысл группирования привилегий для группы (роли), если я не могу предоставить доступ к странице для всей группы?

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Учитывая ваши комментарии, я думаю, что это может быть связано с отсутствующим префиксом ROLE_ для ваших ролей и / или изменением поведения в Spring Security 4.

Роли часто автоматически имеют префикс при заполнении. Например, DefaultLdapAuthoritiesPopulator содержит свойство rolePrefix, которое по умолчанию установлено на ROLE_ (см. источник и в этих документах ). Следовательно, все роли, полученные через LDAP, будут автоматически иметь префикс. Если это так в вашей ситуации, конечно, зависит от того, как вы заполняете свои роли.

Начиная с Spring Security 4, DefaultWebSecurityExpressionHandler по умолчанию добавляет префикс ROLE_ к hasRole(String) и hasAnyRole(String...) (см. источник ). Например, если используется hasRole("ADMIN"), то роль ROLE_ADMIN будет проверяться DefaultWebSecurityExpressionHandler.

Использование hasAuthority("ADMIN") работает, так как префикс для этого выражения не добавляется.

Так что в вашем случае, если ваши роли заполнены без ROLE_, использование hasRole("ADMIN") может на самом деле попытаться сопоставить с ROLE_ADMIN, в зависимости от используемой версии Spring Security. Это также влияет на Thymeleaf, так как Thymeleaf просто использует функциональность Spring Security.

0 голосов
/ 08 мая 2018

Обычно вам не нужно включать префикс ROLE_.

Однако, когда речь идет о Thymeleaf, вам нужно не только включить его, но и учитывать регистр:

<li sec:authorize="hasRole('ROLE_ADMIN')">Admin</li>
<li sec:authorize="hasRole('ROLE_USER')">User</li>

Кроме того, альтернативой ROLE_USER (при условии, что всем прошедшим проверку пользователям назначена эта роль по умолчанию) будет использование isAuthenticated() вместо этого, например:

<li sec:authorize="isAuthenticated()">Authenticated users can see this</li>

Если вы хотите посмотреть, какие роли принадлежат текущему пользователю, вы можете добавить на свою страницу следующее:

<span sec:authentication="principal.authorities"></span>

Он должен отображать массив ролей при загрузке страницы, например, [ROLE_USER, ROLE_ADMIN]

Ссылка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...