我正在尝试按照网络指南使用Spring安全保护我的网站。所以在我的服务器端,WebSecurityConfigurerAdapter和控制器看起来像这样
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter
implements ApplicationContextAware {
@Override
protected void registerAuthentication(AuthenticationManagerBuilde r authManagerBuilder) throws Exception {
authManagerBuilder.inMemoryAuthentication()
.withUser("user").password("password").roles("ADMI N");
}
}
@Controller
//@RequestMapping("/course")
public class CourseController implements ApplicationContextAware{
@RequestMapping(value="/course", method = RequestMethod.GET, produces="application/json")
public @ResponseBody List<Course> get(// The critirion used to find.
@RequestParam(value="what", required=true) String what,
@RequestParam(value="value", required=true) String value) {
//.....
}
@RequestMapping(value="/course", method = RequestMethod.POST, produces="application/json")
public List<Course> upload(@RequestBody Course[] cs) {
}
}
让我很困惑的是服务器没有响应POST / DELETE方法,而GET方法工作正常。顺便说一下,我在客户端使用RestTemplate。例外情况是:
Exception in thread "main" org.springframework.web.client.HttpClientErrorException: 403 Forbidden
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:91)
at org.springframework.web.client.RestTemplate.handleResponseError(RestTemplate.java:574)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:530)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:487)
at org.springframework.web.client.RestTemplate.delete(RestTemplate.java:385)
at hello.Application.createRestTemplate(Application.java:149)
at hello.Application.main(Application.java:99)
我在互联网上搜索了好几天。仍然没有线索。请帮忙。非常感谢
答案 0 :(得分:72)
问题可能是CSRF protection引起的。如果用户不在Web浏览器中使用您的应用程序,则then it is safe to disable CSRF保护。否则你应该确保include the CSRF token in the request。
要disable CSRF protection,您可以使用以下内容:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig
extends WebSecurityConfigurerAdapter implements ApplicationContextAware {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
// ...
.csrf().disable();
}
@Override
protected void registerAuthentication(AuthenticationManagerBuilde r authManagerBuilder) throws Exception {
authManagerBuilder
.inMemoryAuthentication()
.withUser("user").password("password").roles("ADMIN");
}
}
答案 1 :(得分:2)
此问题可能与CSRF或CORS安全保护有关。
以下代码禁用CSRF,并允许所有来源和HTTP方法。所以使用时要注意。
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter implements WebMvcConfigurer {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
}
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedMethods("*");
}
}
答案 2 :(得分:1)
我也一直在寻找日子!只需使用http.csrf()。disable();在您的configure方法上禁用CSRF即可。是我的put请求停止接收403所需的全部操作。
答案 3 :(得分:0)
检查您要通过“标头”发送的令牌,并在数据库中查询相同的令牌,以确定该令牌是否存在。
注意:以上内容仅在使用Spring Boot令牌认证机制的情况下适用。
答案 4 :(得分:-1)
http.httpBasic().disable();
http.authorizeRequests().antMatchers("/signup").permitAll().antMatchers("/*")
.fullyAuthenticated().and().formLogin()
.and().csrf().disable();
http.csrf().disable();