Spring Social Login: как добавить более одного приложения одного и того же социального провайдера (например, Facebook)?

Мое веб-приложение Spring MVC одновременно обслуживает три разных интернет-магазина с тремя разными доменами (назовем их domain1.com, domain2.com и domain3.com).

Для каждого из этих магазинов мне нужно предложить собственный вход в социальную сеть (с настраиваемым заголовком экрана входа, настраиваемым заявлением о конфиденциальности данных и т. д.). Поэтому мне нужно создать три разных приложения социальных провайдеров (например, facebook).

Насколько я понимаю, в Spring Social мне разрешено добавлять только одно FacebookConnectionFactory и, следовательно, только одно приложение-поставщик.

Как я могу, несмотря на это, добавить эти три разных приложения facebook в Spring Social? Способен ли Spring Social справиться с этим? Существуют ли обходные пути?




Ответы (1)


Может быть, я слишком поздно ответил для OP, но это может быть полезно для других разработчиков. Я реализовал обходной путь для этой проблемы, определив свои собственные «Реестры» следующим образом:

<bean id="myConnectionFactoryRegistries" class="package.ShopsFactoryRegistries">
    <property name="registries">
    <map key-type="java.lang.String">
        <entry key="shop1Key" value-ref="connectionFactoryRegistryShop1" />
        <entry key="shop2Key" value-ref="connectionFactoryRegistryShop2" />
    </map>
    </property>
</bean>

<bean id="connectionFactoryRegistryShop1"
    class="org.springframework.social.connect.support.ConnectionFactoryRegistry">
    <property name="connectionFactories">
        <list>
            <bean
                class="org.springframework.social.facebook.connect.FacebookConnectionFactory">
                <constructor-arg value="${facebook.apikey.shop1}" />
                <constructor-arg value="${facebook.apisecret.shop1}" />
            </bean>
        </list>
    </property>
</bean>

<bean id="connectionFactoryRegistryShop2"
    class="org.springframework.social.connect.support.ConnectionFactoryRegistry">
    <property name="connectionFactories">
        <list>
            <bean
                class="org.springframework.social.facebook.connect.FacebookConnectionFactory">
                <constructor-arg value="${facebook.apikey.shop2}" />
                <constructor-arg value="${facebook.apisecret.shop2}" />
            </bean>
        </list>
    </property>
</bean>

И реализовать фабрику, чтобы получить правильный ConnectionFactoryRegistry, относящийся к «текущему» магазину (идентифицируемому по ключу shopKey).

public class ShopsFactoryRegistries
{
    private Map<String, ConnectionFactoryRegistry> registries;

    public ConnectionFactoryRegistry getRegistryForShopKey(String shopKey)
    {
        return registries.get(shopKey);
    }

    //getter and setter for registries
}

С помощью этого кода вы можете получить facebookConnectionFactory для shop1:

String shopKey = "shop1Key";
FacebookConnectionFactory facebookConnectionFactory = (FacebookConnectionFactory) myConnectionFactoryRegistries.getRegistryForShopKey(shopKey).getConnectionFactory(FACEBOOK);
person user6904265    schedule 11.09.2017