在实现Spring Security之前,我可以很容易地在我的服务器上创建一个docker映像,并在它在我的服务器上运行时访问RESTAPI。由于我实现了Spring Security,当我在我的服务器上运行docker映像时,我在每个路径上都会收到“403禁止”响应(通过Jenkins和NGINX)。
当我在本地运行应用程序时,我可以访问所有路径(通过登录,受限路径除外)。例如,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类:
@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类中使用的SIGN_UP_URL常量:
public static final String SIGN_UP_URL = "/users/register";
如您所见,我至少应该能够访问我网站上的/电影/
路径,但即使是那些也是禁止的(在服务器上)。
我在服务器上使用反向代理,{domain}/api/路由到服务器上的3001端口,该端口被重新路由到运行API的内部端口8080。
我想这就是这个问题所需要的所有信息,如果你需要更多的信息,请在这篇文章的回复中索取。
有人能告诉我为什么当我在docker中运行它时会得到“403禁止”响应,以及如何解决这个问题吗?
我认为这很可能是一个CORS的问题。
尝试添加:
http.cors().disable()
并检查结果。
如果它有效,那么您可以尝试实现启用CORS的服务器。