我正在使用Spring Social和Thymeleaf的快速入门示例进行开发,但我意识到它仅支持每个控制器一个Facebook对象。这意味着该示例无法为多个用户提供支持,我猜测这与变量的@Scope有关。它在Spring Boot容器中运行,我想知道如何配置它,以便每个会话都有自己的Facebook对象。
Spring Boot自动配置了很多事情,它会自动配置Facebook、LinkedIn和Twitter属性,并为社交提供者设置连接工厂。
然而,UserIdSource的实现始终将用户ID返回为“anonymous”。一旦建立第一个Facebook连接,第二个浏览器将尝试查找“anonymous”的连接,它会找到并给您授权的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";
}
};
}
}
解决方案
解决方案 是为每个新用户/会话覆盖“匿名”作为UserId。因此,对于每个会话,我们可以简单地返回一个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
(只需将其注入到控制器中,它就已经是一个请求范围的代理)。您为什么认为它不起作用? - Dave Syer