Безопасность Spring работает на локальном хосте, но выдает «403 Forbidden» в docker на сервере - PullRequest
0 голосов
/ 26 апреля 2020

До реализации Spring Security я мог легко создать docker образ на своем сервере и получить доступ к REST-API, когда он работал на моем сервере. Поскольку я реализовал Spring Security, я получаю ответ «403 Forbidden» на каждом пути, когда запускаю образ docker на своем сервере (через Jenkins и NGINX).

Когда я запускаю приложение локально, я могу получить доступ ко всем путям (за исключением входа в систему с ограниченным доступом). Например, http://localhost:8080/movies/1 возвращает mov ie с id 1 должным образом.

Я следовал этому руководству и пытался приспособить большинство вещей к моей собственной настройке.

Это пример одного из моих контроллеров, MovieController:

@RestController
@RequestMapping("/movies")
public class MovieController {
    final MovieRepository MR;
    public MovieController(MovieRepository MR) {this.MR = MR;}

    @RequestMapping("/all")
    @ResponseBody
    public List<Movie> getAllMovies() {
        return MR.findAll();
    }

    @RequestMapping("/byId")
    @ResponseBody
    public Optional<Movie> getMovieById(@RequestParam int id) {
        return MR.findById(id);
    }

    @RequestMapping("/byTitle")
    @ResponseBody
    public Movie getMovieByTitle(@RequestParam String title) {
        return MR.findByTitle(title);
    }
}

Следующий код взят из моего класса WebSecurity:

@EnableWebSecurity
public class WebSecurity extends WebSecurityConfigurerAdapter {
    private final UserDetailsServiceImpl userDetailsService;
    private final BCryptPasswordEncoder bCryptPasswordEncoder;

    public WebSecurity(UserDetailsServiceImpl userDetailsService, BCryptPasswordEncoder bCryptPasswordEncoder) {
        this.userDetailsService = userDetailsService;
        this.bCryptPasswordEncoder = bCryptPasswordEncoder;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
                .authorizeRequests()
                .antMatchers(HttpMethod.POST, SIGN_UP_URL).permitAll()
                .antMatchers("/movies/**").permitAll()
                .antMatchers("/chairs/**").permitAll()
                .anyRequest().authenticated()
                .and().addFilter(new JWTAuthenticationFilter(authenticationManager())).addFilter(new JWTAuthorizationFilter(authenticationManager()))
                // this disables session creation on Spring Security
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    }

    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder);
    }
}

Это константа SIGN_UP_URL, используемая в классе WebSecurity :

public static final String SIGN_UP_URL = "/users/register";

Как видите, я должен хотя бы иметь возможность посещать пути /movies/ на своем веб-сайте, но даже они запрещены (на сервере).

I Я использую обратный прокси на моем сервере, {домен} / api / маршрутизирует на порт 3001 на моем сервере, который перенаправлен на внутренний порт 8080, где работает API.

Я думаю, что это вся информация для этой проблемы, если вам нужна дополнительная информация, пожалуйста, запросите ее в ответах на этот пост.

Может кто-нибудь сказать, почему я получу ответ «403 запрещено», когда я запусту его в * 1032? * а как мне это исправить?

1 Ответ

0 голосов
/ 26 апреля 2020

Я думаю, что это, скорее всего, проблема CORS.

Попробуйте добавить:

http.cors().disable()

и проверьте результат.

Если это работает, то вы можете попробуйте реализовать сервер с поддержкой CORS.

...