我正在尝试使用Spring OAuth2实现令牌吊销。我创建了此端点:
@PostMapping("/oauth/revoke")
public ResponseEntity<String> revoke(@RequestParam Map<String, String> params) {
RevocationService revocationService = revocationServiceFactory
.create(params.get("token_type_hint"));
revocationService.revoke(params.get("token"));
return ResponseEntity.ok().build();
}
Github code
我尝试配置以下权限:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf()
.disable()
.requestMatchers().antMatchers("/oauth/revoke").and()
.httpBasic().and()
.authorizeRequests()
.anyRequest().authenticated()
.and()
.httpBasic()
.and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
我可以成功生成OAuth2令牌,但总是收到Access denied
并使用此请求:
curl --location --request POST 'http://localhost:8080/oauth/revoke' \
--header 'Authorization: Basic YWRtaW46cXdlcnR5' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'token=.......' \
--data-urlencode 'token_type_hint=access_token'
您知道如何解决此问题吗?我想HttpSecurity
的配置不正确,但是我找不到解决此问题的方法。
答案 0 :(得分:1)
您是否可以尝试在班级@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
上添加WebSecurityConfigurerAdapter
。
在不更改其他任何规则的情况下覆盖访问规则 自动配置的功能添加@Bean类型 WebSecurityConfigurerAdapter与 @Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)并将其配置为 满足您的需求。
来自https://docs.spring.io/spring-boot/docs/2.0.0.M5/reference/html/boot-features-security.html
答案 1 :(得分:1)
.csrf()
.disable()
.requestMatchers().antMatchers("/oauth/revoke").permitAll().and()
.httpBasic().and()
将禁用端点/oauth/revoke
的必需身份验证,并将摆脱拒绝访问的错误响应。您没有指定是否必须对请求吊销操作的用户进行身份验证。请注意,假定的解决方案必须在对父路径进行任何身份验证限制之前进行。如果有
.csrf()
.disable()
.requestMatchers().anyRequest().authenticated().and()
.requestMatchers().antMatchers("/oauth/revoke").permitAll().and()
.httpBasic().and()
由于父路径(“ /”)需要验证,因此无法使用。在spring安全中,身份验证要求必须出现在任何未经身份验证的子路径之后。
编辑: 由于您使用的是httpBasic,如果您希望在请求撤消操作时对用户的身份进行身份验证,则可以尝试将curl与以下选项一起使用
curl -i --user user1:user1Pass