我在快速入门示例中使用Spring Social和Thymeleaf进行开发,但我意识到它只支持每个控制器一个Facebook对象。这意味着该示例不能为多个用户提供支持,我猜这与变量的@Scope有关。它在Spring启动容器中运行,我想知道如何配置它,以便每个会话都有自己的Facebook对象。
发布于 2014-11-12 13:38:48
正如您所建议的,Facebook对象应该配置为具有请求作用域。如果你正在使用配置支持和/或Spring Boot,那么它将是请求作用域。因此,即使向控制器注入一次Facebook实例,该实例实际上也是一个代理,它将委托给在请求时为经过身份验证的用户创建的真实FacebookTemplate实例。
我只能假设您指的是http://spring.io/guides/gs/accessing-facebook/的入门指南示例。在这种情况下,它使用了Spring Social可能使用的最简单的Spring Boot自动配置,其中包括UserIdSource的基本实现(尚未用于生产),它总是返回“匿名”作为用户ID。因此,在您创建第一个Facebook连接后,第二个浏览器会尝试查找“匿名”连接,找到它,并为您提供一个授权的Facebook对象。
这可能看起来很奇怪,但它是一个示例应用程序,旨在让你started...and它做到了。要获得一个真正的UserIdSource,您需要做的就是将Spring Security添加到项目中。这将告诉Spring Social autoconfiguration配置一个从安全上下文获取当前用户ID的UserIdSource。这反映了Spring Social在现实世界中的使用,尽管显然更多地涉及到Spring Social,并且超出了入门指南的范围。
但是你可以在https://github.com/spring-projects/spring-social-samples/tree/master/spring-social-showcase-boot上找到Spring Boot中Spring Social的更完整的例子。
发布于 2017-05-04 17:37:42
Spring Boot在后台自动配置了很多东西。它会自动配置Facebook、LinkedIn和Twitter的属性,并为社交提供者设置连接工厂。
然而,UserIdSource的实现总是返回“匿名”作为用户ID。一旦建立了第一个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";
}
};
}
}解决方案
The solution将覆盖“匿名”作为每个新用户/会话的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;
}The solution for above problem has been talked about in detail over here
https://stackoverflow.com/questions/26862956
复制相似问题