Пружинные микросервисы SSO с ReactJS - PullRequest
0 голосов
/ 02 мая 2018

Я работаю над реализацией единого входа в свой проект с помощью приложения для архитектуры микросервиса, используя spring-cloud-netflix. На данный момент я сделал с сервисом OAuth2 и сервисом шлюза.

Вот мой конфиг безопасности для шлюза:

/**
 * SSO security config.
 */
@Configuration
@EnableZuulProxy
@EnableOAuth2Sso
@EnableWebSecurity
public class SsoSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private OAuth2ClientAuthenticationProcessingFilter ssoFilter;
    @Autowired
    private AuthenticationEntryPoint authenticationEntryPoint;
    @Autowired
    private SsoLogoutSuccessHandler logoutSuccessHandler;

    /**
     * SSO http config.
     *
     * @param http configurer
     * @throws Exception exception
     */
    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
//                .cors().and()
                .csrf().disable()
                .authorizeRequests()
                .antMatchers("/", "/test", "/favicon.ico", "/sockjs-node/**", "/static/**", "/*.js", "/*.jpg",
                        "/rest/**", "/uaa/**", "/backend/**",
                        "/users/**", "/files/**", "/roles/**").permitAll()
                .anyRequest().authenticated().and()
//                .exceptionHandling().authenticationEntryPoint(authenticationEntryPoint).and()
                .logout().logoutSuccessHandler(logoutSuccessHandler)
                .and()
                .sessionManagement().maximumSessions(1)
                .expiredUrl("/")
                .maxSessionsPreventsLogin(false);
//        http.addFilterAfter(ssoFilter, BasicAuthenticationFilter.class);

    }

    /**
     * OAuth2 config.
     */
    @Configuration
    protected static class OAuth2Config {

        @Bean
        public OAuth2ClientAuthenticationProcessingFilter ssoFilter(
                SsoLoginSuccessHandler ssoLoginSuccessHandler,
                OAuth2ClientContext beaconOAuth2ClientContext,
                RemoteTokenServices remoteTokenServices,
                OAuth2ProtectedResourceDetails resourceDetails) {
            OAuth2ClientAuthenticationProcessingFilter filter =
                    new OAuth2ClientAuthenticationProcessingFilter("/login");
            filter.setRestTemplate(new OAuth2RestTemplate(resourceDetails,
                    beaconOAuth2ClientContext));
            filter.setTokenServices(remoteTokenServices);
//            filter.setAuthenticationSuccessHandler(new SavedRequestAwareAuthenticationSuccessHandler());
            return filter;
        }
//
//        @Bean
//        public CorsConfigurationSource corsConfigurationSource() {
//            final CorsConfiguration configuration = new CorsConfiguration();
//            configuration.setAllowedOrigins(ImmutableList.of("*"));
//            configuration.setAllowedMethods(ImmutableList.of("HEAD",
//                    "GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"));
//            configuration.setAllowCredentials(true);
//            configuration.setAllowedHeaders(
//                    ImmutableList.of("Authorization", "Cache-Control", "Content-Type"));
//            final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
//            source.registerCorsConfiguration("/**", configuration);
//            return source;
//        }

    }

}

шлюз yaml config

security:
  oauth2:
    client:
      preEstablishedRedirectUri: http://localhost:3000/login
      registeredRedirectUri: http://localhost:3000/login
      accessTokenUri: http://localhost:10035/uaa/oauth/token
      userAuthorizationUri: http://localhost:10035/uaa/oauth/authorize
      clientId: react_app
      clientSecret: react_app_secret
      useCurrentUri: true
    resource:
      tokenInfoUri: http://localhost:10035/uaa/oauth/check_token

Я немного запутался, как мне авторизовать реагирующий клиент приложения, если он работает на другом порту (сервер разработки webpack, порт 3000)?

1 Ответ

0 голосов
/ 02 мая 2018

Одной из альтернатив является настройка прокси с помощью веб-пакета, например, в вашей конфигурации веб-пакета добавьте его следующим образом:

devServer: {
  contentBase: '/static',
  historyApiFallback: true,
  port: 3000,
  compress: false,
  inline: false,
  hot: true,
  host: '0.0.0.0',
  proxy: {
    '/api': { // <---- Intercept all calls to `/api`
      target: 'http://localhost:8080', // <--- Your API server in a different port
      changeOrigin: true,
      secure: false,
    },
  },
},

В предыдущей конфигурации был настроен прокси, поэтому всякий раз, когда есть запрос к /api, он перенаправляет запрос на ваш сервер, работающий на другом порту.

...