spring-boot - 通过使用角色保护和端点,适用于 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 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 令牌相关的详细文档:
推荐阅读
- x11 - 在具有 32 位色深的窗口上绘图
- css - MUI KeyboardDatePicker 更改日期输入框样式
- c++ - 请帮我理解这段代码背后的逻辑
- android - 如何使用 react-native-fs 列出 sdcard/外部存储的所有文件/文件夹
- python - 在 python-3.4+ 中实现导入后挂钩的正确方法
- javascript - 调用 NextJs Route 并将数据传递给组件
- python - 有效地迭代嵌套列表以找到总和
- javascript - 自动滚动到页面底部不起作用 [javascript]
- java - 为什么这个命令不起作用?对值进行排序
- python - 从本地项目目录中的任何位置导入