2010-03-16 2 views
4

Я пытаюсь реализовать функциональность «помню меня» на своем веб-сайте, используя Spring. Файлы cookie и запись в таблице persistent_logins создаются правильно. Кроме того, я вижу, что правильный пользователь восстанавливается, когда имя пользователя отображается в верхней части страницы.Проблема с Remember Me Service in Spring Security

Однако, как только я попытаюсь получить доступ к любой информации для этого пользователя, когда они вернутся после их «запоминания», я получаю исключение NullPointerException. Похоже, что пользователь снова не задан в сеансе.

Мои ApplicationContext-security.xml содержит следующее:

<remember-me data-source-ref="dataSource" user-service-ref="userService"/> 

... 

<authentication-provider user-service-ref="userService" /> 

<jdbc-user-service id="userService" data-source-ref="dataSource" 
role-prefix="ROLE_" 
users-by-username-query="select email as username, password, 1 as ENABLED from user where email=?" 
authorities-by-username-query="select user.id as id, upper(role.name) as authority from user, role, users_roles where users_roles.user_fk=id and users_roles.role_fk=role.name and user.email=?"/> 

Я думал, что это, возможно, что-то делать с пользователями-по-имени пользователя запроса, но, конечно, логин не будет правильно работать, если этот запрос был неправильно ?

Любая помощь в этом была бы принята с благодарностью.

Thanks, gearoid.

+4

Помните, что у вас могут быть два ключевых параметра в вашей конфигурации безопасности. Включить для RememberMeAuthenticationProvider и один для TokenBasedRememberMeServices. Убедитесь, что они равны. – kboom

+0

@kboom Спасибо за упоминание, что есть ДВЕ ключи! –

ответ

4

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

Чтобы просмотреть подробную информацию о том, как следует помнить, вы должны взглянуть на источник для RememberMeAuthenticationFilter. Вы можете найти этот источник здесь (непосредственно):

http://grepcode.com/file/repo1.maven.org/maven2/org.springframework.security/spring-security-web/3.0.2.RELEASE/org/springframework/security/web/authentication/rememberme/RememberMeAuthenticationFilter.java

RememberMeAuthenticationFilter собирается позвонить в RememberMeAuthenticationProvider в результате:

rememberMeAuth = authenticationManager.authenticate(rememberMeAuth); 

Внутри метода AUTHENTICATE вы можете увидеть, что он будет бросать исключение, если вы не указали ключ:

if (this.key.hashCode() != ((RememberMeAuthenticationToken) authentication).getKeyHash()) { 
      throw new BadCredentialsException(messages.getMessage("RememberMeAuthenticationProvider.incorrectKey", 
        "The presented RememberMeAuthenticationToken does not contain the expected key")); 
     } 

Ключ может буквально быть любой строкой «ваш-c» ompany-name- {GUID} "или что-то в этом роде. И тогда ваш помните меня будет выглядеть следующим образом:

<remember-me key="your-company-name-rmkey-aWeFFTgxcv9u1XlkswUUiPolizxcwsqUmml" token-validity-seconds="3600" data-source-ref="dataSource"/> 

Установка маркера валидность это действительно хорошая идея, которую вы должны сделать.

Grant