Весенний социальный Facebook

Я разрабатываю Spring Social и Thymeleaf из примера быстрого запуска, но я понял, что он поддерживает только один объект Facebook для каждого контроллера. Это означает, что образец не может обеспечить поддержку нескольких пользователей, и я предполагаю, что это связано с @Scope переменной. Он работает в загрузочном контейнере Spring, и мне интересно, как я могу настроить это так, чтобы у каждого сеанса был свой собственный объект Facebook.


person F.O.O    schedule 11.11.2014    source источник
comment
Я думаю, вы получаете один Facebook за запрос с автоматической настройкой по умолчанию (просто введите его в свой контроллер, и он уже будет прокси-сервером с областью запроса). Что заставляет вас думать, что это не работает?   -  person Dave Syer    schedule 11.11.2014
comment
Потому что, когда я проверяю в другом браузере, он предполагает, что я тот же пользователь.   -  person F.O.O    schedule 11.11.2014
comment
Определить другой браузер? Новая вкладка или окно браузера, открытое с помощью CTRL+N, не является новым браузером. Также запуск нескольких экземпляров Chrome или Firefox приведет к подключению сеанса.   -  person M. Deinum    schedule 11.11.2014
comment
Это на уровне приложения, что означает, что я попробовал совершенно другой браузер и подтвердил, что новый сеанс был создан, распечатав идентификатор сеанса. Но объект Facebook остается авторизованным между сеансами   -  person F.O.O    schedule 11.11.2014
comment
Вы использовали поддержку автоматической настройки для Spring Social Facebook? Или вы сами настроили?   -  person M. Deinum    schedule 11.11.2014


Ответы (2)


Как вы предложили, объект Facebook должен быть настроен с областью запроса. Если вы используете поддержку конфигурации и/или Spring Boot, она будет ограничена областью запроса. Таким образом, даже несмотря на то, что контроллер один раз внедряется с экземпляром Facebook, этот экземпляр на самом деле является прокси-сервером, который делегирует реальный экземпляр FacebookTemplate, который создается во время запроса для аутентифицированного пользователя.

Я могу только предположить, что вы имеете в виду пример руководства по началу работы на http://spring.io/guides/gs/accessing-facebook/. В этом случае он использует самую простую автоконфигурацию Spring Boot, возможную для Spring Social, которая включает базовую (но не предназначенную для производства) реализацию UserIdSource, которая всегда возвращает «анонимный» в качестве идентификатора пользователя. Поэтому после того, как вы создадите первое соединение с Facebook, второй браузер попытается найти соединение для «анонимного пользователя», найдет его и выдаст вам авторизованный объект Facebook.

Это может показаться странным, но это это пример приложения, предназначенного для того, чтобы вы начали... и оно делает это. Все, что вам нужно сделать, чтобы получить настоящий UserIdSource, — это добавить в проект Spring Security. Это укажет автоконфигурации Spring Social настроить UserIdSource, который извлекает текущий идентификатор пользователя из контекста безопасности. Это отражает более реальное использование Spring Social, хотя очевидно более сложное и выходящее за рамки руководства по началу работы.

Но вы можете посмотреть на https://github.com/spring-projects/spring-social-samples/tree/master/spring-social-showcase-boot для более полного примера Spring Social в Spring Boot.

person Craig Walls    schedule 12.11.2014
comment
Ссылка spring.io/guides/gs/accessing-facebook должна содержать ваши рекомендации по несколько пользователей не могут войти - person baybora.oren; 28.02.2015

Spring Boot автоматически настраивает множество вещей за кулисами. Он автоматически настраивает свойства Facebook, LinkedIn и Twitter и настраивает фабрики соединений для социальных сетей.

Однако реализация UserIdSource всегда возвращает «анонимный» в качестве идентификатора пользователя. Как только первое соединение с Facebook будет установлено, второй браузер попытается найти соединение для «анонимного», которое он найдет и предоставит вам авторизованный объект Facebook.

@Configuration
@EnableSocial
@ConditionalOnWebApplication
@ConditionalOnMissingClass("org.springframework.security.core.context.SecurityContextHolder")
protected static class AnonymousUserIdSourceConfig extends SocialConfigurerAdapter {

    @Override
    public UserIdSource getUserIdSource() {
        return new UserIdSource() {
            @Override
            public String getUserId() {
                return "anonymous";
            }
        };
    }
}

Решение

Решение чтобы переопределить «анонимный» в качестве идентификатора пользователя для каждого нового пользователя/сеанса. Таким образом, для каждого сеанса мы можем просто вернуть SessionID, однако он может быть недостаточно уникальным для идентификации пользователей, особенно если он кэшируется или хранится где-то в базе данных соединений.

@Override
public String getUserId() {
    RequestAttributes request = RequestContextHolder.currentRequestAttributes();
    String uuid = (String) request.getAttribute("_socialUserUUID", RequestAttributes.SCOPE_SESSION);
    if (uuid == null) {
        uuid = UUID.randomUUID().toString();
        request.setAttribute("_socialUserUUID", uuid, RequestAttributes.SCOPE_SESSION);
    }
    return uuid;
}

Решение вышеуказанной проблемы было подробно обсуждалось здесь

person Abhishek Galoda    schedule 04.05.2017