簡體   English   中英

Spring 安全適用於本地主機,但在服務器上的 docker 中給出“403 Forbidden”

[英]Spring security works on localhost, but gives '403 Forbidden' in docker on server

在實施 Spring 安全性之前,我可以輕松地在我的服務器上創建一個 docker 映像,並在它在我的服務器上運行時訪問 REST-API。 由於我實施了 Spring 安全性,當我在服務器上運行 docker 映像時(通過 Jenkins 和 NGINX),我在每個路徑上都會收到“403 Forbidden”響應。

當我在本地運行應用程序時,我可以訪問所有路徑(通過登錄,受限路徑除外)。 例如http://localhost:8080/movies/1正確返回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 class:

@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);
    }
}

這是 WebSecurity class 中使用的 SIGN_UP_URL 常量:

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

如您所見,我至少應該能夠訪問我網站上的/movies/路徑,但即使是那些也被禁止(在服務器上)。

我在我的服務器上使用反向代理,{domain}/api/ 路由到我服務器上的端口 3001,該端口被重新路由到內部端口 8080,API 正在運行。

我認為這是此問題所需的所有信息,如果您需要更多信息,請在對這篇文章的回復中提出要求。

誰能告訴我為什么我在 docker 中運行它時會收到“403 禁止”響應,以及如何解決這個問題?

我認為這很可能是 CORS 問題。

嘗試添加:

http.cors().disable()

並檢查結果。

如果它有效,那么您可以嘗試實現啟用 CORS 的服務器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM