[英]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.