Как интегрировать аутентификацию Spring-Social с Spring-Security?

У меня есть небольшое веб-приложение, защищенное spring-security, с использованием комбинации имени пользователя и пароля на sql-db в качестве учетных данных.

Теперь я хочу добавить аутентификацию facebook/twitter с помощью spring-social. Используя примеры, я могу хранить учетные данные пользователей в своей базе данных. Сейчас я работаю над аутентификацией пользователя в его текущем сеансе в моем приложении, используя следующий фрагмент кода:

public String signIn(String userId, Connection<?> connection, NativeWebRequest request) {

    User user = userService.getUserById(Long.parseLong(userId));
    user.setPassword(this.passwordEncoder.encodePassword(user.getAccessToken(), this.salt));
    this.userService.store(user);

    UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(user.getDisplayName(), user.getAccessToken());

    HttpServletRequest req = request.getNativeRequest(HttpServletRequest.class); // generate session if one doesn't exist
    token.setDetails(new WebAuthenticationDetails(req));
    Authentication authenticatedUser = this.authenticationManager.authenticate(token);
    SecurityContextHolder.getContext().setAuthentication(authenticatedUser);

    return "/user/dashboard";
}

Аутентификация работает, я не получаю никаких исключений BadCredential. Но после перенаправления на /user/dashboard меня отбрасывает обратно к логину.

У меня нет идей, аналогичный фрагмент кода для аутентификации сеанса работает после классической регистрации.

У кого-нибудь есть идеи, почему это происходит или как это отладить?

Большое спасибо заранее! Хендрик


person Hendrik Söbbing    schedule 15.02.2012    source источник
comment
Все это зависит. Я столкнулся с такой же ситуацией, и оказалось, что мое сопоставление разрешает только роль ROLE_ANONYMOUS, к которой мне тоже было отказано в доступе после входа в систему. Мне пришлось изменить его, чтобы также разрешить ROLE_USER. По какой-то причине это не было проблемой при использовании Spring Security непосредственно для входа в систему (например, при обычном входе или входе в форму).   -  person Josh Johnson    schedule 03.01.2013


Ответы (1)


У меня есть аналогичный код, который работает для меня, а также добавляет поддержку «запомнить меня»:

// lookup by id, which in my case is the login
User user = userService.findByLogin(userId);
// code to populate the user's roles
List<GrantedAuthority> authorities = ...;
// create new instance of my UserDetails implementation
UserDetailsImpl springSecurityUser = new UserDetailsImpl(user, authorities);
// create new Authentication using UserDetails instance, password, and roles
Authentication authentication = new UsernamePasswordAuthenticationToken(springSecurityUser, user.getPassword(), authorities);
// set the Authentication in the SecurityContext
SecurityContextHolder.getContext().setAuthentication(authentication);
// optional: remember-me support (must @Autowire in TokenBasedRememberMeServices)
tokenBasedRememberMeServices.onLoginSuccess(
    (HttpServletRequest) request.getNativeRequest(),
    (HttpServletResponse) request.getNativeResponse(),
    authentication);
person sdouglass    schedule 22.03.2012