使用 Spring Boot 2.7 (Spring Security 5.7.1) 并嘗試將 API 配置為資源服務器和 OAuth2 客戶端,我發現了一種我無法理解的行為:
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((authorize) -> authorize
.mvcMatchers("/swagger-ui/**", "/api-docs/**").permitAll()
.anyRequest().permitAll())
// register OAuth2 resource server
.oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt)
// register OAuth2 client
.oauth2Client(withDefaults());
return http.build();
}
}
檢查日志,所有這些過濾器都適用
o.s.s.web.DefaultSecurityFilterChain : Will secure any request with
org.springframework.security.web.session.DisableEncodeUrlFilter@320ca97c,
org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@3c592c0c,
org.springframework.security.web.context.SecurityContextPersistenceFilter@2b33e616,
org.springframework.security.web.header.HeaderWriterFilter@2e9bff08,
org.springframework.security.web.csrf.CsrfFilter@7926d092,
org.springframework.security.web.authentication.logout.LogoutFilter@37227aa7,
org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestRedirectFilter@6f18445b,
org.springframework.security.oauth2.server.resource.web.BearerTokenAuthenticationFilter@42af2977,
org.springframework.security.web.savedrequest.RequestCacheAwareFilter@79e3f444, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@1252d480,
org.springframework.security.web.authentication.AnonymousAuthenticationFilter@3979c6e8,
org.springframework.security.oauth2.client.web.OAuth2AuthorizationCodeGrantFilter@19faa9dc,
org.springframework.security.web.session.SessionManagementFilter@7d3b4646,
org.springframework.security.web.access.ExceptionTranslationFilter@6cb2d5ea,
到目前為止,此配置在我保護的其他 API 中按預期作業。但是,在這個特定的,并且沒有保護任何端點,我看到:
我可以訪問任何GET端點,但任何POST端點都回傳一個403 FORBIDDEN. 但是,如果我將令牌添加到請求中,即使它是過期的令牌,我也可以訪問它們
僅此一點我就無法理解.anyRequest().permitAll(),如果我沒記錯的話,應該取消保護任何東西。
如果我注釋掉配置 oauth2 ResourceServer 的行
`// .oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt)`
這個過濾器消失了
org.springframework.security.oauth2.server.resource.web.BearerTokenAuthenticationFilter
并且不能再使用POST端點,即使是過期的令牌
從邏輯上講,我希望 APIoauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt)如此
使用時我無法訪問 POST 端點是怎么.anyRequest().permitAll())回事?
免責宣告:我知道如果所有端點都必須是公共的,那么將 API 宣告為資源服務器是沒有意義的。Discord 回呼將訪問端點,我必須弄清楚是否可以使用 OAuth 保護它們
編輯:
server.servlet.context-path = /api
控制器
@RestController
@RequestMapping("/slack")
public class SlackBotController {
@PostMapping("/test")
public String test(@RequestBody String a) {
return a;
}
@GetMapping("/test")
public String testGet() {
return "OK";
}
}
要求
GET/POST http://localhost:8081/api/slack/test
請求標頭
User-Agent: PostmanRuntime/7.29.0
Accept: */*
Postman-Token: f20ba7a6-26e5-47c4-a827-0596afec27b8
Host: localhost:8081
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 3
Cookie: JSESSIONID=D1C2B2668DC130C63DDE03F30574ED5F; JSESSIONID=823D79956CFBF14F3C77C96E29F4131C
回應標頭
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Type: application/json
Transfer-Encoding: chunked
Date: Fri, 03 Jun 2022 12:03:00 GMT
Keep-Alive: timeout=60
Connection: keep-alive
uj5u.com熱心網友回復:
POST端點或POST回傳的原因403 FORBIDDEN是因為在spring中默認啟用了CSRF保護。
這意味著每個修改請求(POST、PUT、DELETE、PATCH)都需要一個 CSRF 令牌。否則請求被拒絕以防止 CSRF 攻擊。
要禁用 CSRF 保護:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable();
}
uj5u.com熱心網友回復:
這里的問題是 CSRF 保護。當您使用http.oauth2ResourceServer()Spring Security 配置 CSRF 以忽略包含 header 的請求時Authorization: Bearer whatever,請注意它必須包含Bearer 前綴。
在您共享的請求示例中,您沒有包含 Authorization 標頭。
看一下Spring Security中的代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/485756.html
上一篇:JPA可重用物體和關系
