Моя установка - сервер шлюза Zuul, перенаправляющий на API обработки книг (Spring). Проблема в том, что он перенаправляет нормально, когда маршрут не аутентифицирован, но , когда я пытаюсь получить доступ к аутентифицированному маршруту - не удается . Я добавлю, что доступ к API напрямую работает нормально.
Это моя конфигурация безопасности в шлюзе:
@EnableWebSecurity
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user").password("{noop}password").roles("USER")
.and()
.withUser("admin").password("{noop}admin").roles("ADMIN");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/book-service/books").permitAll()
.antMatchers("/eureka/**").hasRole("ADMIN")
.anyRequest().authenticated().and()
.formLogin().usernameParameter("username").passwordParameter("password")
.defaultSuccessUrl("/success").and()
.logout().permitAll().and()
.csrf().disable();
}
}
Мои свойства Zuul в шлюзе:
zuul.routes.book-service.path=/book-service/**
zuul.routes.book-service.sensitive-headers=Set-Cookie,Authorization
zuul.routes.book-service.url=http://localhost:8085
hystrix.command.book-service.execution.isolation.thread.timeoutInMilliseconds=600000
И это мой фильтр Zuul на шлюзе:
@Component
public class SessionSavingZuulPreFilter
extends ZuulFilter {
@Autowired
private SessionRepository repository;
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext context = RequestContext.getCurrentContext();
HttpSession httpSession = context.getRequest().getSession();
Session session = repository.findById(httpSession.getId());
context.addZuulRequestHeader(
"Cookie", "SESSION=" + httpSession.getId());
return null;
}
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 0;
}
}
Теперь в клиентском API у меня есть такая конфигурация безопасности:
http.httpBasic()
.disable()
.authorizeRequests()
.antMatchers(HttpMethod.GET, "/books").permitAll()
.antMatchers(HttpMethod.GET, "/books/*").hasRole("ADMIN")
.antMatchers(HttpMethod.POST, "/books").hasRole("ADMIN")
.antMatchers(HttpMethod.PATCH, "/books/*").hasRole("ADMIN")
.antMatchers(HttpMethod.DELETE, "/books/*").hasRole("ADMIN")
//.antMatchers("/encrypt/**").permitAll()
//.antMatchers("/decrypt/**").permitAll()
.anyRequest().authenticated()
.and()
.csrf()
.disable();
Я могу получить доступ http://localhost : 8085 / books / 1 после аутентификации (поэтому фильтр, кажется, работает нормально), но http://localhost: [шлюз] / book-service / books / 1 выдает ошибку. Кто-нибудь может помочь?