Spring Security - получить имя пользователя в AuthenticationSuccessHandler без UserDetails / UserDetailsService - PullRequest
0 голосов
/ 18 декабря 2011

Я пытаюсь установить время LastLogin для пользователя в пользовательском AuthenticationSuccessHandler, однако я не знаю способа получения имени пользователя (поскольку все функции доступа, похоже, возвращают ноль, потому что я не работаю сUserDetails).Пользовательские данные хранятся в таблице MYSQL, и я использую Hibernate для извлечения / создания / обновления пользователей.В моем приложении я использую самописный класс User, который не имеет ничего общего с классом Spring User.У меня нет пользовательских UserDetails / UserDetailsService, и я бы хотел их избежать, поскольку я не могу изменить макет таблицы БД (как при добавлении дополнительных значений)

AuthenticationSuccessHandler выглядит следующим образом:

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()); //Doesn't work, getName seems to return null
            super.onAuthenticationSuccess(request, response, authentication);
        }
}

Мое applicationContext-security.xml выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans 
                    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                    http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd">

<global-method-security pre-post-annotations="enabled"/>
<!-- authentication-success-handler-ref='authSuccHandler' -->
<http use-expressions="true" disable-url-rewriting="true">
    <intercept-url pattern="..." access="hasRole('ROLE_USER')" />
    <form-login login-page="/index.htm"
                authentication-failure-handler-ref='authFailureHandler'
                authentication-success-handler-ref='authSuccHandler'
                default-target-url='...'
                always-use-default-target='true'/>
    <logout logout-success-url="..."/>
    <session-management invalid-session-url="/index.htm">
        <concurrency-control max-sessions="2" error-if-maximum-exceeded="true" />
    </session-management>
</http>

<authentication-manager>
    <authentication-provider>
        <jdbc-user-service data-source-ref="mysqldataSource" 
                    authorities-by-username-query="select username, authority from benutzer where username = ?"
                    users-by-username-query="select username, password, enabled from benutzer where username = ?"/>
    </authentication-provider>
</authentication-manager>

</beans:beans>

Сам логин работает нормально (даже если я просто закомментирую строку trackUserLogin в моем AuthenticationSuccessHandler), что заставляет меня поверить, чточтобы получить способ получить это имя пользователя.Кто-нибудь может помочь?

1 Ответ

4 голосов
/ 18 декабря 2011

Попробуйте authentication.getPrincipal().

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