Spring Social Facebook

3
我正在使用Spring Social和Thymeleaf的快速入门示例进行开发,但我意识到它仅支持每个控制器一个Facebook对象。这意味着该示例无法为多个用户提供支持,我猜测这与变量的@Scope有关。它在Spring Boot容器中运行,我想知道如何配置它,以便每个会话都有自己的Facebook对象。

1
我认为您可以通过默认的自动配置每个请求获取一个Facebook(只需将其注入到控制器中,它就已经是一个请求范围的代理)。您为什么认为它不起作用? - Dave Syer
2
因为当我使用另一个浏览器进行检查时,它会认为我是同一用户。 - F.O.O
定义另一个浏览器?使用CTRL+N打开的新标签页或浏览器窗口不是一个新的浏览器。同时启动多个Chrome或Firefox实例将导致会话附加。 - M. Deinum
这是在应用程序级别的意思,也就是说我尝试了一个完全不同的浏览器,并通过打印会话ID确认创建了一个新的会话。但是Facebook对象在不同的会话之间保持授权状态。 - F.O.O
你使用了Spring Social Facebook的自动配置支持吗?还是自己进行了配置? - M. Deinum
2个回答

2
正如您所建议的那样,Facebook对象应该配置为请求范围。如果您正在使用配置支持和/或Spring Boot,则它将是请求范围。因此,即使控制器只注入一次Facebook实例,该实例实际上是一个代理,将委托给在请求时为经过身份验证的用户创建的真正的FacebookTemplate实例。
我只能假设您指的是在http://spring.io/guides/gs/accessing-facebook/中的入门指南示例。在这种情况下,它使用了Spring Social最简单的Spring Boot自动配置,其中包括一个基本的(但不适用于生产)UserIdSource实现,它始终将“anonymous”作为用户ID返回。因此,在创建第一个Facebook连接之后,第二个浏览器尝试查找“anonymous”的连接,找到它,并向您提供授权的Facebook对象。
这可能看起来很奇怪,但它确实是一个旨在让您入门的示例应用程序...它做到了这一点。要获取真正的UserIdSource,您只需将Spring Security添加到项目中即可。这将告诉Spring Social自动配置配置从安全上下文中获取当前用户ID的UserIdSource。这反映了Spring Social的更真实的世界使用,尽管显然更加复杂,并超出了入门指南的范围。
但是,您可以查看https://github.com/spring-projects/spring-social-samples/tree/master/spring-social-showcase-boot,以获取Spring Boot中Spring Social的更完整示例。

http://spring.io/guides/gs/accessing-facebook/链接需要包含您关于多个用户无法登录的建议。 - bora.oren

2

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;
}

这个问题的解决方案已经在这里详细讨论了


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接