Как интегрировать Spring-социальную аутентификацию с Spring-Security? - PullRequest
2 голосов
/ 16 февраля 2012

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

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

</p> <pre><code>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 я снова получаю логин.

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

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

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

1 Ответ

1 голос
/ 22 марта 2012

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

// 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);
...