0

Привет У меня проблема с CORS с установкой микросервисов sso, но я не понимаю, почему. Моя установка:spring zuul gateway с oauth2 sso и угловым 2 Проблема CORS

OAuth microservice порт 8899:

@Configuration 
@Order(-20) 
public class EndpointSecurityConfig extends WebSecurityConfigurerAdapter { 

private AuthenticationManager authenticationManager; 

@Autowired 
public EndpointSecurityConfig(AuthenticationManager authenticationManager) { 
    this.authenticationManager = authenticationManager; 
} 

@Override 
public void configure(HttpSecurity http) throws Exception { 
// @formatter:off 

    http 
    .formLogin() 
     .loginPage("/login") 
     .usernameParameter("name") 
     .loginProcessingUrl("/login.do").permitAll() 
    .and() 
     .requestMatchers().antMatchers("/login", "/login.do", "/oauth/authorize", "/oauth/confirm_access") 
    .and() 
     .authorizeRequests().anyRequest().authenticated(); 

// @formatter:on 
} 

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

PrincipalRestController

Zuul порт шлюза 8765:

@SpringBootApplication 
@EnableEurekaClient 
@EnableZuulProxy 
@EnableOAuth2Sso 
@EnableAutoConfiguration 
@EnableFeignClients 
public class GatewayApplication extends WebSecurityConfigurerAdapter { 

public static void main(String[] args) { 
    SpringApplication.run(GatewayApplication.class, args); 
} 

@Override 
    protected void configure(HttpSecurity http) throws Exception { 
    // @formatter:off 
    http 
     .logout().and() 
     .authorizeRequests() 
      .antMatchers("/index.html", "/**/*.js", "/", "/login").permitAll() 
      .anyRequest().authenticated() 
      .and() 
     .csrf() 
      .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()); 
    // @formatter:on 
    } 
} 

Zuul конфигурации:

server: 
port: 8765 

spring: 
    aop: 
    proxy-target-class: true 

security: 
    basic: 
    enabled: false 

oauth2: 
    user: 
    password: none 
    client: 
    accessTokenUri: http://localhost:8899/uaa/oauth/token 
    userAuthorizationUri: http://localhost:8899/uaa/oauth/authorize 
    clientId: client 
    clientSecret: secret 
    resource: 
    userInfoUri: http://localhost:8899/uaa/principal 
    preferTokenInfo: false 

zuul: 
    routes: 
    adminPortal: 
     url: http://localhost:4200 
     path: /** 
    user: 
     url: http://localhost:8899/uaa/principal 

углового 2 приложения порт 4200 за шлюзом:

служба

@Injectable() 
export class LoginService { 
constructor (private http: Http) {} 

getLoggedInUser() : Observable<LoggedInUser>{ 

var authHeader = new Headers(); 
authHeader.append("X-Requested-With", "XMLHttpRequest"); 

return this.http.get("/user",{ 
    headers: authHeader 
}) 
.map((res:Response) => res.json()) 
.catch((error:any) => Observable.throw(error.json().error || 'Server error')); 

} 

logout() : Observable<LoggedInUser>{ 

var authHeader = new Headers(); 
authHeader.append("X-Requested-With", "XMLHttpRequest"); 

return this.http.post("/logout",{},{headers: authHeader}) 
.map((res:Response) => res.json()) 
.catch((error:any) => Observable.throw(error.json().error || 'Server error')); 

} 
} 

компонент

@Component({ 
selector: 'app-root', 
templateUrl: './app.component.html', 
styleUrls: ['./app.component.sass'], 
providers: [ LoginService ] 
}) 
export class AppComponent { 

loggedInUser: LoggedInUser; 

constructor(
    private loginService: LoginService 
){ 
    this.getLoggedInUser(); 
    } 

getLoggedInUser(){ 
    // Get all comments 
    this.loginService.getLoggedInUser() 
    .subscribe(
     loggedInUser => this.loggedInUser = loggedInUser, 
    err => { 
     console.log(err); 
    }); 
    } 

    logout(){ 
    this.loginService.logout() 
    .subscribe(
     loggedInUser => this.loggedInUser = loggedInUser, 
     err => { 
      console.log(err); 
     }); 
    } 

    } 

Так что если я иду в браузер и открыть локальный сервер: 8765/запрос укоренилось на главный angular2, где выполняется вызов getLoggedInUser(). Это перейдет к «localhost: 8765/user», потому что на этом этапе пользователь не регистрируется в этом вызове с ошибкой с 302, как ожидалось, но затем автоматически перенаправляется для входа в систему 302, а затем другие вызовы в цепочке выполняются с 302. В этом то же время показывает консоль

XMLHttpRequest не может загрузить http://localhost:8899/uaa/oauth/authorize?client_id=client&redirect_uri=http://localhost:8765/login&response_type=code&state=woE3Yc. Перенаправить из 'http://localhost:8899/uaa/oauth/authorize?client_id=client&redirect_uri=http://localhost:8765/login&response_type=code&state=woE3Yc' в 'http://localhost:8899/uaa/login' был заблокирован политикой CORS: заголовок Access-Control-Allow-Origin отсутствует на запрашиваемом ресурсе. Происхождение 'http://localhost:8765' поэтому не допускается.

все это демонстрируется на изображении ниже:

enter image description here

enter image description here

+0

Добавьте заголовок, который позволяет получить доступ к другим сайтам. –

+0

Спасибо @ RomanC, можно ли мне привести пример? – user1048282

ответ

0

конфигурации CORS в вашем весеннем приложении: https://spring.io/guides/gs/rest-service-cors/

или эта документация ссылка https://spring.io/blog/2015/06/08/cors-support-in-spring-framework#javaconfig

+0

Да я прочитал эту статью, и я добавил код, приведенный ниже, не повезло: @Bean общественного WebMvcConfigurer corsConfigurer() { вернуть новый WebMvcConfigurerAdapter() { '@Override' общественные недействительными addCorsMappings (CorsRegistry реестра) { registry.addMapping ("/**").allowedOrigins("http://localhost:8765"); } }; } – user1048282

+0

try '.allowedOrigins (" * ")' или '.allowedOrigins (" http: // localhost: 8765 ")' –

+0

да, извините, мой предыдущий ответ я положил ".allowedOrigins ('http: // localhost: 8765 ') ", и теперь я даже попытался.allowedOrigins ("*") эта же проблема:/haha ​​github удаляет http :) – user1048282