Zuul шлюз не перенаправляет на указанный URL после аутентификации безопасности - PullRequest
0 голосов
/ 02 апреля 2020

Моя установка - сервер шлюза 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 выдает ошибку. Кто-нибудь может помочь?

...