Я разрабатываю Spring Social и Thymeleaf из примера быстрого запуска, но я понял, что он поддерживает только один объект Facebook для каждого контроллера. Это означает, что образец не может обеспечить поддержку нескольких пользователей, и я предполагаю, что это связано с @Scope переменной. Он работает в загрузочном контейнере Spring, и мне интересно, как я могу настроить это так, чтобы у каждого сеанса был свой собственный объект Facebook.
Весенний социальный Facebook
Ответы (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.
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;
}
Решение вышеуказанной проблемы было подробно обсуждалось здесь
Facebook
за запрос с автоматической настройкой по умолчанию (просто введите его в свой контроллер, и он уже будет прокси-сервером с областью запроса). Что заставляет вас думать, что это не работает? - person Dave Syer   schedule 11.11.2014