简体   繁体   English

Spring 社交 Facebook 在 2.0.2 版本中不起作用

[英]Spring social Facebook doesn't work in version 2.0.2

Hello everyone when I upgrade my application to spring version 2.0.2 I get this exception:大家好,当我将应用程序升级到 Spring 2.0.2 版时,出现此异常:

Description: Field connectionFactoryLocator in com.ssp.api.v1.security.SecurityConfiguration required a bean of type 'org.springframework.social.connect.ConnectionFactoryLocator' that could not be found.说明:com.ssp.api.v1.security.SecurityConfiguration 中的字段 connectionFactoryLocator 需要一个无法找到的“org.springframework.social.connect.ConnectionFactoryLocator”类型的 bean。

here's my code:这是我的代码:

SecurityConfiguration.java Configuration SecurityConfiguration.java 配置

@Configuration
@ComponentScan(basePackages = { "com.ssp.api.vi.security" })
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired private ConnectionFactoryLocator connectionFactoryLocator;
    @Autowired private UsersConnectionRepository usersConnectionRepository;
    @Autowired private FacebookConnectionSignup facebookConnectionSignup;
    @Autowired private SspUserDetailsService sspUserDetailsService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/api/session").permitAll()
                .antMatchers("/h2-console/**").permitAll()
                .antMatchers("/api/**").authenticated()
                .and()
                .requestCache()
                .requestCache(new NullRequestCache())
                .and()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
                .and().csrf().disable();
    }

    //@Autowired
    @Bean
    public ProviderSignInController providerSignInController() {
        ((InMemoryUsersConnectionRepository) usersConnectionRepository)
          .setConnectionSignUp(facebookConnectionSignup);

        return new ProviderSignInController(
          connectionFactoryLocator, 
          usersConnectionRepository, 
          new FacebookSignInAdapter());
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth)
      throws Exception {
        auth.authenticationProvider(authenticationProvider());
    }

    @Bean
    public DaoAuthenticationProvider authenticationProvider() {
        DaoAuthenticationProvider authProvider
          = new DaoAuthenticationProvider();
        authProvider.setUserDetailsService(sspUserDetailsService);
        authProvider.setPasswordEncoder(encoder());
        return authProvider;
    }

    @Bean
    public PasswordEncoder encoder() {
        return new BCryptPasswordEncoder(11);
    }

    @Override
    @Bean(name = BeanIds.AUTHENTICATION_MANAGER)
    public AuthenticationManager authenticationManagerBean() throws Exception { return super.authenticationManagerBean(); }

    @Override
    @Bean(name = BeanIds.USER_DETAILS_SERVICE)
    public UserDetailsService userDetailsServiceBean() throws Exception { return this.sspUserDetailsService; }

AuthUtil.java Class AuthUtil.java 类

protected static final Logger log = LoggerFactory.getLogger(AuthUtil.class);

    public static void authenticate(Connection<?> connection) {
        UserProfile userProfile = connection.fetchUserProfile();
        String username = userProfile.getUsername();
        UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(username, null, null);
        SecurityContextHolder.getContext().setAuthentication(authentication);
        log.info("User {} {} connected.", userProfile.getFirstName(), userProfile.getLastName());
    }

FacebookConnectionSignup.class Service FacebookConnectionSignup.class 服务

@Service
public class FacebookConnectionSignup implements ConnectionSignUp {

    @Override
    public String execute(Connection<?> connection) {

        return connection.getDisplayName();
    }
}

FacebookSignInAdapter.java Class FacebookSignInAdapter.java 类

public class FacebookSignInAdapter implements SignInAdapter{
    @Override
    public String signIn(String userId, Connection<?> connection, NativeWebRequest request) {

        SecurityContextHolder.getContext().setAuthentication(
                new UsernamePasswordAuthenticationToken(
                connection.getDisplayName(), null, 
              Arrays.asList(new SimpleGrantedAuthority("FACEBOOK_USER"))
              )
        );

        return null;
    }
}

SocialConfiguration.java Configuration SocialConfiguration.java 配置

 @Configuration
    public class SocialConfiguration {
        @Bean
        public SignInAdapter authSignInAdapter() {
            return (userId, connection, request) -> {
                AuthUtil.authenticate(connection);
                return null;
            };
        }
    }

### SspUserDetailsService.class Service

@Service
public class SspUserDetailsService implements UserDetailsService {
    @Autowired private UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userRepository.findById(username).orElse(null);
        if (user == null)
            throw new UsernameNotFoundException(username);

        return new SspUserDetails(user);
    }
}

Console Error:控制台错误:

Description:

Field connectionFactoryLocator in com.ssp.api.v1.security.SecurityConfiguration required a bean of type 'org.springframework.social.connect.ConnectionFactoryLocator' that could not be found.


Action:

Consider defining a bean of type 'org.springframework.social.connect.ConnectionFactoryLocator' in your configuration.

This code works perfectly In Spring 1.5.10 version.此代码在 Spring 1.5.10 版本中完美运行。

How can I solve this issue?我该如何解决这个问题?

Before of all thank you!先谢谢大家!

In Boot 2.x, you need to define the ConnectionFactoryLocator and UsersConnectionRepository in your SecurityConfiguration class, instead of autowiring them:在 Boot 2.x 中,您需要在SecurityConfiguration类中定义ConnectionFactoryLocatorUsersConnectionRepository ,而不是自动装配它们:

private ConnectionFactoryLocator connectionFactoryLocator() {
    ConnectionFactoryRegistry registry = new ConnectionFactoryRegistry();
    registry.addConnectionFactory(new FacebookConnectionFactory(appId, appSecret));
    return registry;
}

private UsersConnectionRepository getUsersConnectionRepository(ConnectionFactoryLocator connectionFactoryLocator) {
    return new InMemoryUsersConnectionRepository(connectionFactoryLocator);
} 

Here, appId and appSecret are coming from application.properties.这里, appIdappSecret来自 application.properties。

You also need to change the implementation for your ProviderSignInController bean:您还需要更改ProviderSignInController bean 的实现:

@Bean
public ProviderSignInController providerSignInController() {
    ConnectionFactoryLocator connectionFactoryLocator = connectionFactoryLocator();
    UsersConnectionRepository usersConnectionRepository = getUsersConnectionRepository(connectionFactoryLocator);
    ((InMemoryUsersConnectionRepository) usersConnectionRepository).setConnectionSignUp(facebookConnectionSignup);
    return new ProviderSignInController(connectionFactoryLocator, usersConnectionRepository, new FacebookSignInAdapter());
}

You can find more details here .您可以在此处找到更多详细信息。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM