Spring Security - Предоставлено. Авторский и ролевый доступ - PullRequest
1 голос
/ 17 марта 2019

Я использую пользовательский UserDetailService, который отлично работает для аутентификации.Проблема в том, что я не могу использовать ограничения на основе ролей.

Странно, что я получаю правильные права доступа от контроллера:

public ModelAndView getMembers(HttpServletRequest request, Authentication auth) 
{
   if(auth != null)
   {
      for (GrantedAuthority ga : auth.getAuthorities())
      {
         // works find and logs "ADMIN", btw. I'm using SimpleGrantedAuthority
         this.logger.debug("0{}", ga);
      }
   }
}

Но с конфигурацией

http
   .csrf().disable()
   .authorizeRequests()
   .antMatchers("/Admin/**").hasRole("ADMIN")
   …

Пользователь не может получить доступ к страницам, например, /Admin / Member.

То же самое относится и к тими-лист-тегам безопасности, например,

<div sec:authorize="isAuthenticated() && hasRole('ADMIN')">Hello Admin!</div>

не показывает "Hello Admin!"для пользователей, у которых контроллер регистрирует полномочия "ADMIN".

Я предполагаю, что что-то упустил или что-то не так.

Спасибо за ваше время и помощь.

1 Ответ

1 голос
/ 30 марта 2019

Как сказано в комментариях, вы должны использовать hasAuthority("ADMIN") вместо hasRole("ADMIN").

Важно проводить различие между предоставленными полномочиями и ролями. Есть статья от Baeldung, объясняющая это: Предоставленные полномочия в сравнении с ролью в Spring Security . Из этой статьи мы можем понять разницу:

GrantedAuthority

В Spring Security мы можем думать о каждом предоставленном полномочии как об отдельной привилегии . Примеры могут включать в себя READ_AUTHORITY, WRITE_PRIVILEGE или даже CAN_EXECUTE_AS_ROOT. [...]

При непосредственном использовании GrantedAuthority, например, с помощью выражения типа hasAuthority (‘READ_AUTHORITY’), мы ограничиваем доступ детально.

Роль как Полномочия

Точно так же в Spring Security мы можем думать о каждой роли как о крупномасштабном GrantedAuthority, который представлен в виде строки и имеет префикс «ROLE» . При непосредственном использовании роли, например, через выражение типа hasRole («ADMIN»), мы ограничиваем доступ грубым образом.

...