当前位置: 首页 > 知识库问答 >
问题:

Spring Security:按客户端类型启用/禁用CSRF(浏览器/非浏览器)

连德水
2023-03-14

Spring Security文档显示:

“当您使用CSRF保护时?我们建议对正常用户可以通过浏览器处理的任何请求使用CSRF保护。如果您只创建非浏览器客户端使用的服务,则可能需要禁用CSRF保护。”


如果我的服务将被"浏览器"和"非浏览器"客户端(如第三方外部服务)使用,Spring Security是否提供了一种仅针对某些类型的客户端禁用CSRF的方法

共有3个答案

司寇灵均
2023-03-14

下面是我用来在appconfig security上的特定endpoint上禁用CSRF保护的内容。xml添加一个包含模式信息的节点,如以下示例所示:

<http security="none" pattern="/sku/*"/>
<http security="none" pattern="/sku/*/*"/>
<http security="none" pattern="/sku"/>

只要记住,如果要使用map all request,那么使用符号“*”的顺序很重要。

司徒焕
2023-03-14

我的天哪,盒子里没有这样的东西。在你的情况下,我会做的是,有一个URL的层次结构,例如,植根于/api,这将免除csrf。它很容易配置。在XML配置中,有一个普通的

<http pattern="/api/**">
    ...
    <!-- csrf -->
</http>

由于它是第一个,任何对/api层次结构的请求都会触发它,而不使用csrf,所有其他请求都会使用它。

在应用程序的正常部分,您永远不会使用/api/**url,并将它们保留给非浏览器使用。

然后在控制器中,将它们映射到其正常url和/api下的副本:

@Controller
@RequestMapping({ "/rootcontrollerurl", "/api/rootcontrollerurl"})
class XController {
    @RequestMapping(value = "/request_part_url", ...)
    public ModelAndView method() {
        ...
    }
}

(当然,rootControlerurlrequest_part_url可能是空白的...)

但您必须分析允许非csrf控制的请求的安全含义,并最终将控制器从/api层次结构中排除。

糜正业
2023-03-14

我相信在Spring Security XML中有一种方法可以做到这一点,但是由于我使用的是Java配置,下面是我的解决方案。

 @Configuration
 @EnableWebSecurity
 public class SecurityConfig {

    @Configuration
    @Order(1)
    public static class SoapApiConfigurationAdapter extends WebSecurityConfigurerAdapter {
        protected void configure(HttpSecurity http) throws Exception {
            http
                .antMatcher("/soap/**")
                .csrf().disable()
                .httpBasic();
        }
    }


    @Configuration
    public static class WebApiConfigurationAdapter extends WebSecurityConfigurerAdapter {

        protected void configure(HttpSecurity http) throws Exception {
            http        
                .formLogin()
                    .loginProcessingUrl("/authentication")
                    .usernameParameter("j_username")
                    .passwordParameter("j_password").permitAll()
                    .and()
                .csrf().disable()

        }
     }
}
 类似资料:
  • 我有一个Spring Boot REST API。由于安全策略,我需要为浏览器访问的endpoint启用CSRF保护。但是,非浏览器也可以访问此API。有没有一种方法可以创建两组endpoint,一个只能由启用CSRF的浏览器访问,另一个只能由禁用CSRF的非浏览器访问?

  • 一面-2023年5月6日 ios客户端,大前端、object-c 自我介绍。有点背稿的感觉。 聊一个项目。说了OSG的项目。提到内存管理。 开始八股。内存:只能指针。 多态,静态、动态。模板、虚函数。静态的除了模板还有啥。析构函数为什么要添加虚函数。 空类size的大小。 struct/class的区别。 堆/栈/BSS几个内存类别 TCP四次挥手。 ipv4地址空间这么小怎么够用,NAT。用同一

  • 二面-2023年5月8日 第一次迟到了面试.. 自我介绍。刚开始没准备各种结巴,语言不顺。整体还是讲完了。 项目。疯狂问项目、但是又不是挖,就是让自己讲。讲了好几个项目。看起来不是特别满意。一个是我自己准备项目拿普通横向项目准备的亮点肯定不够不到位,另外岗位是客户端,没有什么相关的。 岗位匹配度上,问了好几遍和原技术栈不匹配,自己的个人想法。(一开始也是你捞的我,我有啥想法 手撕算法。快排。这两面

  • 我对硒很陌生。我开发了一个应用程序,使用一个selenium web驱动程序来做网页上的一些动作。当我在本地运行时,它可以很好地工作,也就是说,它在我的机器中启动了一个浏览器。我在VM服务器上部署了这个应用程序,所以脚本在服务器上运行(在VM Ware机器中启动的浏览器),而不是在客户端。谁能帮助我如何在客户端启动浏览器?

  • 问题内容: 如何禁用浏览器的“后退”按钮(跨浏览器)? 问题答案: 这个问题是非常相似,这一个 … 您需要强制缓存过期才能正常工作。将以下代码放在页面代码后面。

  • 免责声明:我知道这个问题有重复(一、二、三),但是: null 我的代码: 这将打印: (所有3个请求返回200个http代码) 我有JVM选项: (在我的keystore.jks中添加了vk.com证书) 下面是http-client的内部日志 当然,上面的测试是在关闭内部日志记录的情况下执行的,因为它会给每个请求增加大约50毫秒的额外时间。 我已经读了三遍所有的apache http-clie