Предоставленные пользователю полномочия всегда: ROLE_ANONYMOUS? - PullRequest
5 голосов
/ 13 октября 2010

Я использую следующий метод для программного входа после регистрации

private void autoLogin(User user,
            HttpServletRequest request)
    {

GrantedAuthority[] grantedAuthorities = new GrantedAuthority[] { new GrantedAuthorityImpl(
                "ROLE_ADMIN") };

        UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
                user.getUsername(), user.getPassword(),grantedAuthorities);

        // generate session if one doesn't exist
        request.getSession();

        token.setDetails(new WebAuthenticationDetails(request));
        Authentication authenticatedUser = authenticationManager.authenticate(token);

        SecurityContextHolder.getContext().setAuthentication(authenticatedUser);
    }

пользователь аутентифицирован, но всегда имеет ROLE_ANONYMOUS. Я не знаю почему? есть идеи ?

Ответы [ 2 ]

8 голосов
/ 13 октября 2010

Это поведение выглядит очень странно.Javi предлагает сохранить контекст безопасности в сеансе вручную, но это должно быть сделано автоматически с помощью Spring Security SecurityContextPersistenceFilter.

Одной из возможных причин, которую я могу себе представить, является filters = "none" на <intercept-url> вашей страницы обработки регистрации.

filters = "none" отключает все фильтры безопасности для указанного URL.Как видите, это может помешать другим функциям Spring Security.Таким образом, лучший подход состоит в том, чтобы оставить фильтры включенными, но настроить их так, чтобы они были доступны для всех пользователей.У вас есть несколько вариантов:

  • При старом синтаксисе атрибута access (т.е. без <http use-expressions = "true" ...>):
    • access = "ROLE_ANONYMOUS" разрешает доступ для неаутентифицированных пользователей, но запрещаетаутентифицированные
    • Чтобы разрешить доступ всем пользователям, вы можете написать access = "IS_AUTHENTICATED_ANONYMOUSLY, IS_AUTHENTICATED_FULLY, IS_AUTHENTICATED_REMEMBERED"
  • Используя новый синтаксис на основе языка Spring Expression (<http use-expressions = "true" ...>) вы просто пишете access = "true", чтобы разрешить доступ всем пользователям (но другие <intercept-url> должны также использовать этот синтаксис).
0 голосов
/ 13 октября 2010

У меня была похожая проблема, и мне пришлось вручную установить сеанс после выполнения аутентификации.

request.getSession().setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, SecurityContextHolder.getContext());

Попробуй.

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