Spring Security 2.0 Facebook Connect - PullRequest
3 голосов
/ 12 апреля 2011

Я пытаюсь реализовать вход через 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 */

И теперь все работает нормально.Еще раз спасибо за вашу помощь.

1 Ответ

3 голосов
/ 12 апреля 2011

Один из возможных способов заключается в следующем.Хотя он может быть не идеальным, но он работает хорошо.

Создайте класс FacebookAuthenticationToken, который расширяет AbstractAuthenticationToken и содержит ваш пользовательский объект в Facebook (предполагается, что он FacebookUser).

После кода, который вы упомянули выше, добавьте следующий код сразу после него в тот же контроллер:

String code = request.getParameter("code");
String accessToken = fbStuffKeeper.retrieveAccessToken(code);
facebookClient = new DefaultFacebookClient(accessToken);
User userFb = facebookClient.fetchObject("me", User.class);

// Find FacebookUser with current FB_uid, create new if found none, load its information in an instance of FacebookUser

Authentication a = new FacebookAuthenticationToken(fbUserObject);
a.setAuthenticated(true);
SecurityContextHolder.getContext().setAuthentication(a);

// your authentication is complete, redirect to some other page
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...