All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.healthy.common.security.social.SocialConfig Maven / Gradle / Ivy

package com.healthy.common.security.social;

import cn.hutool.core.util.StrUtil;
import com.healthy.common.security.properties.*;
import com.healthy.common.security.social.qq.connet.QQOAuth2ConnectionFactory;
import com.healthy.common.security.social.support.HealthySpringSocialConfigurer;
import com.healthy.common.security.social.support.SocialAuthenticationFilterPostProcessor;
import com.healthy.common.security.social.weibo.connet.WeiboOAuth2ConnectionFactory;
import com.healthy.common.security.social.weixin.connet.WeixinOAuth2ConnectionFactory;
import com.healthy.common.security.social.weixinmp.connet.WeixinMpOAuth2ConnectionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureOrder;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.security.crypto.encrypt.Encryptors;
import org.springframework.social.UserIdSource;
import org.springframework.social.config.annotation.ConnectionFactoryConfigurer;
import org.springframework.social.config.annotation.EnableSocial;
import org.springframework.social.config.annotation.SocialConfigurerAdapter;
import org.springframework.social.connect.*;
import org.springframework.social.connect.jdbc.JdbcUsersConnectionRepository;
import org.springframework.social.connect.web.ConnectController;
import org.springframework.social.connect.web.ProviderSignInUtils;
import org.springframework.social.security.AuthenticationNameUserIdSource;
import org.springframework.social.security.SpringSocialConfigurer;

import javax.sql.DataSource;

/**
 * 社交登录配置主类
 */
@Configuration
@AutoConfigureOrder(Integer.MIN_VALUE)
@EnableSocial
public class SocialConfig extends SocialConfigurerAdapter {

    @Autowired
    private DataSource dataSource;

    @Autowired
    private SecurityProperties securityProperties;

    @Autowired(required = false)
    private ConnectionSignUp connectionSignUp;

    @Autowired(required = false)
    private SocialAuthenticationFilterPostProcessor socialAuthenticationFilterPostProcessor;

    @Override
    public void addConnectionFactories(ConnectionFactoryConfigurer connectionFactoryConfigurer, Environment environment) {

        QQProperties qq = securityProperties.getSocial().getQq();
        if (StrUtil.isNotBlank(qq.getAppId())) {
            QQOAuth2ConnectionFactory qqoAuth2ConnectionFactory = new QQOAuth2ConnectionFactory(qq.getProviderId(), qq.getAppId(), qq.getAppSecret());
            connectionFactoryConfigurer.addConnectionFactory(qqoAuth2ConnectionFactory);
        }

        WeixinProperties weixinProperties = securityProperties.getSocial().getWeixin();
        if (StrUtil.isNotBlank(weixinProperties.getAppId())) {
            WeixinOAuth2ConnectionFactory weixinOAuth2ConnectionFactory = new WeixinOAuth2ConnectionFactory(weixinProperties.getProviderId(), weixinProperties.getAppId(),
                    weixinProperties.getAppSecret());
            connectionFactoryConfigurer.addConnectionFactory(weixinOAuth2ConnectionFactory);
        }

        WeixinMpProperties weixinMpProperties = securityProperties.getSocial().getWeixinmp();
        if (StrUtil.isNotBlank(weixinMpProperties.getAppId())) {
            WeixinMpOAuth2ConnectionFactory weixinMpOAuth2ConnectionFactory = new WeixinMpOAuth2ConnectionFactory(weixinMpProperties.getProviderId(), weixinMpProperties.getAppId(),
                    weixinMpProperties.getAppSecret());
            connectionFactoryConfigurer.addConnectionFactory(weixinMpOAuth2ConnectionFactory);
        }

        WeiboProperties weiboProperties = securityProperties.getSocial().getWeibo();
        if (StrUtil.isNotBlank(weiboProperties.getAppId())) {
            WeiboOAuth2ConnectionFactory weiboOAuth2ConnectionFactory = new WeiboOAuth2ConnectionFactory(weiboProperties.getProviderId(), weiboProperties.getAppId(), weiboProperties.getAppSecret());
            connectionFactoryConfigurer.addConnectionFactory(weiboOAuth2ConnectionFactory);
        }
    }

    @Override
    public UsersConnectionRepository getUsersConnectionRepository(ConnectionFactoryLocator connectionFactoryLocator) {
        JdbcUsersConnectionRepository repository = new JdbcUsersConnectionRepository(dataSource,
                connectionFactoryLocator, Encryptors.noOpText());

        String jdbcTablePrefix = securityProperties.getSocial().getJdbcTablePrefix();
        if (StrUtil.isNotBlank(jdbcTablePrefix)) {
            repository.setTablePrefix(jdbcTablePrefix);
        }
        if (connectionSignUp != null) {
            repository.setConnectionSignUp(connectionSignUp);
        }
        return repository;
    }

    /**
     * 社交登录配置类,供浏览器或app模块引入设计登录配置用。
     *
     * @return
     */
    @Bean
    public SpringSocialConfigurer healthySocialSecurityConfig() {
        String filterProcessesUrl = securityProperties.getSocial().getFilterProcessesUrl();
        HealthySpringSocialConfigurer configurer = new HealthySpringSocialConfigurer(filterProcessesUrl);
        configurer.signupUrl(securityProperties.getBrowser().getSignUpUrl());
        configurer.setSocialAuthenticationFilterPostProcessor(socialAuthenticationFilterPostProcessor);
        return configurer;
    }

    /**
     * 用来处理注册流程的工具类
     *
     * @param connectionFactoryLocator
     * @return
     */
    @Bean
    public ProviderSignInUtils providerSignInUtils(ConnectionFactoryLocator connectionFactoryLocator) {
        return new ProviderSignInUtils(connectionFactoryLocator, getUsersConnectionRepository(connectionFactoryLocator)) {
        };
    }

    /**
     * Constructs a ConnectController.
     *
     * @param connectionFactoryLocator the locator for {@link ConnectionFactory} instances needed to establish connections
     * @param connectionRepository     the current user's {@link ConnectionRepository} needed to persist connections; must be a proxy to a request-scoped bean
     */
    @Bean
    @ConditionalOnMissingBean({ConnectController.class})
    public ConnectController connectController(ConnectionFactoryLocator connectionFactoryLocator, ConnectionRepository connectionRepository) {
        return new ConnectController(connectionFactoryLocator, connectionRepository);
    }

    @Override
    public UserIdSource getUserIdSource() {
        return new AuthenticationNameUserIdSource();
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy