调用Spring Security下接口 get 可以成功,而post失败

简介: 调用第三方接口的时候,因为接口是在Spring Security权限项目路下的,所以会出现只有get成功而post失败的情况。

原因
springSecurity会对所有http请求以及所有静态资源进行拦截,一般情况下静态资源以及http请求则不需要进行拦截。

        http.authorizeRequests()
                .antMatchers("/api/**", "/css/**", "/js/**", "/fonts/**", "/images/**")
                .permitAll()
                .anyRequest()
                .authenticated()

以上是基本配置,就是允许拦截通过。
但是springSecurity在2.0之后会默认自动开启CSRF跨站防护,而一旦开启了CSRF,所有经的http请求以及资源都被会CsrfFilter拦截,仅仅GET|HEAD|TRACE|OPTIONS这4类方法会被放行,也就是说post,delete等方法依旧是被拦截掉的,限制了除了get以外的大多数方法,报出403错误。

解决方案
查阅了一些帖子,最多的就是关闭CSRF或者重写过滤器。当然方法很多,毕竟跨域的作用也很大。所以就有ignoring方法的使用了。它是完全绕过spring security的所有filter的。罗列以下三种方式:

1.法一
直接配置configure(HttpSecurity http),直接关闭,这样的话都不会被拦截,所以还是不建议这样做

http.csrf().disable();

2.法二
通过配置方形的url,这样就不会拦截

http.csrf().ignoringAntMatchers("/druid/*");

3.法三
单独拿出来配置,与前两者不同,配置类中再次重写configure方法

@Override
    public void configure(WebSecurity web){
        web.ignoring().antMatchers("/api/**", "/css/**", "/js/**", "/fonts/**", "/images/**", "/lib/**","/ws/**");
    }

完整配置展示

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private MyAuthenctiationSuccessHandler myAuthenctiationSuccessHandler;
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.headers().frameOptions().disable(); //用于加载页面iframe部分
        http.authorizeRequests()
                .antMatchers("/druid/**","/getVerify","/css/**", "/js/**", "/fonts/**")
                .permitAll() // 允许所有用户访问
                .anyRequest().authenticated()
                .and()
            .formLogin() // 定义当需要用户登录时候,转到的登录页面
                .loginPage("/login") 
                .failureUrl("/login?error=true")
                .defaultSuccessUrl("/index")//成功登录后跳转页面
                .successHandler(myAuthenctiationSuccessHandler)
                .permitAll()
                .and()
            .sessionManagement()
                .invalidSessionUrl("/login")
                .and()
            .requestCache().disable()
            .logout()
                .logoutSuccessUrl("/login") //成功退出后跳转到的页面
                .permitAll()//退出
                .and()
            .csrf()//.disable();
            .ignoringAntMatchers("/pushLog/**","/druid/**");
    }
    
    @Override
    public void configure(WebSecurity web){
        web.ignoring().antMatchers("/swagger-ui.html","/doc.html", "/v2/**", "/webjars/**", "/swagger-resources/**");
    }
    
    @Bean
    public AuthenticationProvider authenticationProvider() {
        AuthenticationProvider provider = new MyAuthenticationProvider();
        return provider;
    }
    
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(authenticationProvider());
    }
    
}

总结
这样的方式也比较直接简单,本文也没有对源码进行阐述,以后会不上,也是因为正好遇到这个问题,写出来大家一起学习吧,对于接口的认证则需要自己在接口中进行验证了。

相关文章
|
JSON 安全 Java
什么是JWT?如何使用Spring Boot Security实现它?
什么是JWT?如何使用Spring Boot Security实现它?
2704 5
|
XML Java 数据格式
探索Spring之利剑:ApplicationContext接口
本文深入介绍了Spring框架中的核心接口ApplicationContext,解释了其作为应用容器的功能,包括事件发布、国际化支持等,并通过基于XML和注解的配置示例展示了如何使用ApplicationContext管理Bean实例。
|
缓存 安全 Java
Spring Get请求 与post请求
本文详细介绍了Spring框架中GET请求和POST请求的区别及应用场景。GET请求用于从服务器获取资源,参数附在URL末尾,适合查看非敏感信息;POST请求用于向服务器提交数据,参数在请求体中传输,适合处理敏感信息。Spring通过`@GetMapping`和`@PostMapping`注解分别处理这两种请求。此外,文章还提供了示例代码,展示了如何在Spring中实现这两种请求的处理。最后,文章总结了推荐使用POST请求的原因,包括更高的安全性、更大的数据传输量、更好的幂等性及灵活性。
990 2
Spring Get请求 与post请求
|
自然语言处理 JavaScript Java
Spring 实现 3 种异步流式接口,干掉接口超时烦恼
本文介绍了处理耗时接口的几种异步流式技术,包括 `ResponseBodyEmitter`、`SseEmitter` 和 `StreamingResponseBody`。这些工具可在执行耗时操作时不断向客户端响应处理结果,提升用户体验和系统性能。`ResponseBodyEmitter` 适用于动态生成内容场景,如文件上传进度;`SseEmitter` 用于实时消息推送,如状态更新;`StreamingResponseBody` 则适合大数据量传输,避免内存溢出。文中提供了具体示例和 GitHub 地址,帮助读者更好地理解和应用这些技术。
3083 122
|
安全 Java 数据安全/隐私保护
使用Spring Security实现细粒度的权限控制
使用Spring Security实现细粒度的权限控制
|
安全 Java 数据库
实现基于Spring Security的权限管理系统
实现基于Spring Security的权限管理系统
|
存储 NoSQL Java
Spring Boot项目中使用Redis实现接口幂等性的方案
通过上述方法,可以有效地在Spring Boot项目中利用Redis实现接口幂等性,既保证了接口操作的安全性,又提高了系统的可靠性。
914 1
|
存储 数据采集 Java
Spring Boot 3 实现GZIP压缩优化:显著减少接口流量消耗!
在Web开发过程中,随着应用规模的扩大和用户量的增长,接口流量的消耗成为了一个不容忽视的问题。为了提升应用的性能和用户体验,减少带宽占用,数据压缩成为了一个重要的优化手段。在Spring Boot 3中,通过集成GZIP压缩技术,我们可以显著减少接口流量的消耗,从而优化应用的性能。本文将详细介绍如何在Spring Boot 3中实现GZIP压缩优化。
2353 6