Я пытаюсь реализовать вход через Facebook в наше приложение на основе Spring Framework 2.5, в котором уже есть обычная аутентификация по имени и паролю.
Я получил эту часть кода в моем контроллере, где у меня есть данные пользователя Facebook в объекте userFb:
String code = request.getParameter("code");
String accessToken = fbStuffKeeper.retrieveAccessToken(code);
facebookClient = new DefaultFacebookClient(accessToken);
User userFb = facebookClient.fetchObject("me", User.class);
Я могу проверить, есть ли пользователь в БД, и если нет, то яЯ могу хранить его в БД и хранить его FB_uid и другие необходимые учетные данные.Проблема в том, что я хочу войти в систему этого пользователя после некоторого условия, если он уже авторизован в системе.Мой текущий менеджер аутентификации решает по этому правилу:
<authentication-provider>
<jdbc-user-service data-source-ref="dataSource"
users-by-username-query="select username, password, confirmed, 1 AS enabled FROM person WHERE confirmed=1 and username=?"
authorities-by-username-query="select username, authority from person where username=?"/>
<password-encoder hash="md5"/>
</authentication-provider>
Итак, мой вопрос: как мне войти в систему пользователя, найденного в БД, который пытается подключиться через Facebook?Другой поставщик аутентификации?Есть ли способ сделать его вход в систему, используя некоторый подобный код, как мой упомянутый?
Большое спасибо.
*** РЕДАКТИРОВАТЬ: Большое спасибо.Похоже, это может помочь.Теперь у меня есть один пользователь в БД, в который я хочу войти.Я сделал этот код в контроллере:
User userFb = facebookClient.fetchObject("me", User.class);
Person person = personDao.getPersonByFbUid(userFb.getId());
GrantedAuthority[] grantedAuthorities = new GrantedAuthorityImpl[1];
grantedAuthorities[0] = new GrantedAuthorityImpl(person.getAuthority());
Authentication a = new FacebookAuthenticationToken(grantedAuthorities, person);
a.setAuthenticated(true);
SecurityContextHolder.getContext().setAuthentication(a);
Я также создал FacebookAuthenticationToken:
public class FacebookAuthenticationToken extends AbstractAuthenticationToken {
private Person person;
public FacebookAuthenticationToken(GrantedAuthority[] authorities, Person person) {
super(authorities);
this.person = person;
}
public Object getCredentials() {
return person;
}
public Object getPrincipal() {
this.person;
} /* + Person getter and setter */
И теперь все работает нормально.Еще раз спасибо за вашу помощь.