拒绝令牌撤销访问

时间:2020-07-23 22:45:39

标签: spring spring-boot spring-security spring-security-oauth2

我正在尝试使用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的配置不正确,但是我找不到解决此问题的方法。

2 个答案:

答案 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