弹簧安全403错误

时间:2013-10-19 16:18:58

标签: spring spring-mvc spring-security

我正在尝试按照网络指南使用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)

我在互联网上搜索了好几天。仍然没有线索。请帮忙。非常感谢

5 个答案:

答案 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:如果应用程序用户未从浏览器使用它,则可以禁用它。
  • 对于CORS:您可以指定来源并允许HTTP方法。

以下代码禁用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();