Органы безопасности Springboot отсутствуют в другой части кода - PullRequest
0 голосов
/ 03 апреля 2020

В моем весеннем загрузочном приложении

После успешного входа в систему я устанавливаю детали аутентификации (с ролями пользователей в полномочиях) в контексте

    // Perform the authentication
    Authentication authentication = authenticationManager.authenticate(
            new UsernamePasswordAuthenticationToken(
                    authenticationRequest.getUsername(),
                    authenticationRequest.getPassword()
            )
    );
    SecurityContextHolder.getContext().setAuthentication(authentication);

Но когда я пытаюсь получить доступ к ролям снова в других частях кода со строкой ниже права доступа равны нулю. В противном случае в нем есть все другие данные безопасности.

Чего мне не хватает?

SecurityContextHolder.getContext().getAuthentication().getAuthorities()

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

После успешного входа в систему я устанавливаю детали аутентификации (с ролями пользователей в полномочиях) в контексте

Вы не должны устанавливать детали аутентификации, такие как роли, которые вы упоминаете после успешной аутентификации в контексте , Я объясню основы c flow:

  1. Запрос на аутентификацию поставляется с параметрами имени пользователя и пароля.
  2. UsernamePasswordAuthenticationFilter извлечет учетные данные и создаст UsernamePasswordAuthenticationToken (имя пользователя, пароль) и передаст диспетчеру аутентификации .
  3. Аутентификация менеджера аутентификации делегируется соответствующему провайдеру аутентификации, который поддерживает объект запроса аутентификации UsernamePasswordAuthenticationToken. (Вы можете иметь собственную реализацию провайдера аутентификации.)
  4. Поддерживающий провайдер аутентификации будет получать сведения о пользователе (, включая полномочия , еще не аутентифицировано ) по введенному имени пользователя, скажем, из БД, и сравнивает представленный пароль с полученным паролем пользователя. В случае успеха данные пользователя вместе с полномочиями передаются UsernamePasswordAuthenticationToken, который будет создан с 3 аргументами, такими как : new UsernamePasswordAuthenticationToken(userDetails,null,roles) который в конструкторе устанавливает флаг аутентификации в true.
  5. Aut менеджер аутентификации заполняет контекст безопасности этим токеном (шаг 4)

Таким образом, успешный вход в систему неявно указывает, что роли также присутствуют. У вас есть реализация userDetailsService, зарегистрированная у провайдера аутентификации или менеджера аутентификации? Будем рады помочь вам больше ...

0 голосов
/ 03 апреля 2020

Я думаю, что вы должны добавить роли при создании UsernamePasswordAuthenticationToken, например:

new UsernamePasswordAuthenticationToken(
    authenticationRequest.getUsername(),
    authenticationRequest.getPassword(),
    roles
)

Это подпись метода, который вы должны использовать:

UsernamePasswordAuthenticationToken(Object principal, Object credentials,
            Collection<? extends GrantedAuthority> authorities)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...