自建营销型企业网站,seo上海网站推广,企业网站建设的提案,央视新闻的新闻我这2天新建了一个Spring Boot项目测试#xff0c;在控制器上写了两个接口#xff0c;一个是支持Get方式访问#xff0c;另一个支持Post方式访问#xff0c;发现Get可以#xff0c;而Post不行。前端Post后#xff0c;报403#xff0c;找不到这个方法。
一、原因
原因是…我这2天新建了一个Spring Boot项目测试在控制器上写了两个接口一个是支持Get方式访问另一个支持Post方式访问发现Get可以而Post不行。前端Post后报403找不到这个方法。
一、原因
原因是spring boot的防csrf跨站点请求伪造机制导致。
当我们新建一个Spring Boot项目的时候如果有添加了 spring-boot-starter-security 依赖系统就会默认启用基本认证来保护所有端点这是为了增加应用的安全性。如果没有配置显式的安全规则Spring Security 将会要求进行身份验证。表现在前端就是访问这个接口的时候会弹出一个窗口让我们输入账号密码而且这个窗口还不是我们自己做的。通常我们会在项目里添加一个配置类然后里面加一些白名单。比如获取验证码、登录这些接口应设置为免身份认证否则没法玩。
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers(/captcha,/verify).permitAll().anyRequest().authenticated().and().httpBasic(); // 使用 HTTP 基本认证}
}
但这段代码只解决了/captcha,/verify被允许无须身份验证就能访问的问题但没有解决get可以访问而post不能访问的问题。也许 Spring Security 认为GET 请求相对于 POST 请求的行为通常会有所不同所以对GET比较宽容而POST就较为严格。这涉及到对CSRF的理解。
二、解决
解决之道就是在上面的Security配置中禁止对CSRF防范的限制加上http.csrf().disable()
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {Overrideprotected void configure(HttpSecurity http) throws Exception {http.csrf().disable().authorizeRequests().antMatchers(/slideCaptcha,/slideVerify)//.antMatchers(/**).permitAll().anyRequest().authenticated().and().httpBasic(); // 使用 HTTP 基本认证}
}三、小结
去除防CSRF限制好像有点不安全。但事实上通常post方式访问的接口都需要进行身份验证。身份验证的安全性要高于CSRF防范。另外现在微服务架构大行其道前后端分离二者地址、端口都不一样。前端向后端请求、提交的地址几乎都经过nginx转发。也就是说跨域请求是常态防范没有太多意义。
相关拙作 防御CSRF问题 WEB项目的安全性注意事项