Spring Security - имя пользователя для аутентификации равно нулю в AuthenticationSuccessHandler - PullRequest
3 голосов
/ 30 ноября 2011

У меня есть класс Customer, в котором есть вся информация об учетной записи (он НЕ расширяет класс userdetails.User в Spring). Я пытаюсь сделать некоторые вещи после успешного входа в систему (например, установить новое время последнего входа в систему). Для этого я настроил пользовательский AuthenticationSuccessHandler.

В методе onAuthenticationSuccess я пытаюсь получить имя пользователя из объекта Authentication. Этот объект, однако, является User объектом. Если я попытаюсь получить username, я получу ноль. Можно ли как-то сделать объект Authority объектом Customer? Или мой класс Customer должен расширять класс User?

Обновление

Некоторые подробности:

У меня есть класс пользователя. Он полностью написан самостоятельно и не реализует и не расширяет интерфейс или класс. У меня нет класса, который реализует UserDetailsService. <form-login> часть моего applicationContext-security.xml выглядит так:

<form-login login-page="/index.htm"
                authentication-success-handler-ref='authSuccHandler'
                authentication-failure-handler-ref='authFailureHandler'
                default-target-url='/library/login.htm'
                always-use-default-target='true'/>

Theh authSuccHandler выглядит следующим образом: (необходимое определение компонента на месте)

public class PostSuccessfulAuthenticationHandler extends  SimpleUrlAuthenticationSuccessHandler 
{
@Autowired
private UserService userService;

@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
        Authentication authentication) throws ServletException, IOException 
        {
            userService.trackUserLogin(authentication.getName()); //NullPointerException
            super.onAuthenticationSuccess(request, response, authentication);
        }
}

Форма перенаправляет на j_spring_security_check

Ответы [ 3 ]

1 голос
/ 12 ноября 2012

Когда запрос поступает в обработчик успешной аутентификации, он ожидает, что вы перенаправите на нужный URL.Используйте следующее, чтобы перенаправить на нужную страницу, например home.htm.Это будет работать определенно!Модифицированный код приведен ниже.Проверьте это и дайте мне знать, если у вас есть какие-либо проблемы.

 public class PostSuccessfulAuthenticationHandler extends  SimpleUrlAuthenticationSuccessHandler 
  {
        @Autowired
        private UserService userService;

        @Override
        public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
    Authentication authentication) throws ServletException, IOException 
    {
        userService.trackUserLogin(authentication.getName()); //NullPointerException
        response.sendRedirect("home.htm");
        //super.onAuthenticationSuccess(request, response, authentication);
    }
}
1 голос
/ 30 ноября 2011

Authentication не может быть User, так как они не наследуют друг друга.

Если ваш UserDetailsService производит пользовательский UserDetails, вы сможете получить его, позвонив getDetails() на Authentication.

0 голосов
/ 27 февраля 2012

Я думаю, что вы ищете метод getPrincipal при аутентификации. Затем вам нужно обработать объект, который возвращается в ваш пользовательский класс.

User user = (User)authentication.getPrincipal();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...