首页 > 解决方案 > 通过使用角色保护和端点,适用于 GET 方法 bot 而不是 POST,我收到 403 Forbidden

问题描述

通过使用 Keycloack springboot 适配器(带有 spring 安全性),在定义典型SecurityConfig(从 扩展 KeycloakWebSecurityConfigurerAdapter)并覆盖“配置”方法时,我在定义端点的访问角色时遇到了问题,如下所示:

// typically access is defined something like this:
http
.authorizeRequests()
.antMatchers(GET, "/SOME_ENDPOINT").hasRole("SOME_ROLE")
....

这对我有用,但是当我将 GET 更改为 POST 时,我的 API 突然响应 - 403 Forbidden - 用于预期的端点(是的,我还更新了控制器的 @RequestMapping 注释方法本身的 HTTP 方法)。

更奇怪的是,我已经创建了许多“仅承载”API,也通过 Keycloak + springboot 适配器 + spring security 进行保护,通过 HTTP 方法区分这种类型的端点访问没有任何问题(我使用过 POST、PATCH、 PUT 等),它们工作正常。

“仅限非承载”客户是否有某种限制,或者我可能忽略了什么?

编辑:问题似乎源于这样一个事实,即 spring security 只允许每个默认的 GET 方法,并且按照我在评论中共享的链接上的建议解决这个问题的方法是禁用 csrf,如下所示:

.csrf().disable() 

正如那里所解释的那样,这会停用所有端点的安全性,这不是我打算做的。我期望的是,所有 http POST 方法调用(或任何 HTTP 方法)都将由与其“GET”对应物相同的模式处理和保护。

标签: spring-bootspring-securitykeycloak

解决方案


长话短说,对于遇到类似问题的任何人;Spring security 通过其默认的 CSRF(跨站点请求伪造)保护策略,将对所有非安全 http 动词(POST、PUT、PATCH、DELETE)类型的请求产生 HTTP 403 拒绝访问。

在堆栈溢出论坛上经常看到的一种解决方法是简单地禁用对端点子集的 csrf 检查,如下所示:

//@configure method of your Spring Security config

// disable some endpoints
http.csrf().ignoringAntMatchers("/URL_PREFIX_WHERE_CRSF_IS_IGNORED/*")....

// or disable all endpoints
http.csrf().disable()....

更好的方法是为任何请求显式包含 csrf 令牌(从而避免停用 csrf 检查的需要)。

正如评论中所见,PraveenKumar Lalasangi 提供了对该问题的洞察,这里是与包含/使用 csrf 令牌相关的详细文档:

https://docs.spring.io/spring-security/site/docs/3.2.5.RELEASE/reference/htmlsingle/#csrf-include-csrf-token


推荐阅读