Аннотации @RolesAllowed всегда вызывают ошибку 403 с Keycloak - PullRequest
0 голосов
/ 04 августа 2020

Я новичок в Spring boot и, возможно, у меня глупый вопрос. У меня есть простое приложение api spring boot rest с весенней безопасностью и oauth2. Брокер Outh2 - Keycloak. Мой фильтр безопасности выглядит так: метод контроллера Я всегда получаю 403 запрещенную ошибку. Без аннотаций все работает нормально, без токена я получаю 401, а если токен истек, 403. Это пример моего jwt

{
  
  "realm_access": {
    "roles": [
      "admin"
    ]
  },
  "resource_access": {
    "edge_client": {
      "roles": [
        "cli_admin"
      ]
    }
  },
  "scope": "profile web-origins email",
  "email_verified": false,
  "name": "John Spartan",
  "groups": [
    "admin"
  ],
  "preferred_username": "test_admin",
  "given_name": "John",
  "family_name": "Spartan"
}

1 Ответ

1 голос
/ 04 августа 2020

Я думаю, что этот класс отвечает за получение полномочий. По умолчанию он ищет претензии scope или scp в jwt. В вашем случае у вас "scope": "profile web-origins email". После этого перед каждым авторитетом ставится префикс DEFAULT_AUTHORITY_PREFIX , равный SCOPE_. Я думаю, что когда вы будете отлаживать свой Authentication объект из SecurityContextHolder.getContext().getAuthentication() полномочий, возвращаемых его getAuthorities(), он будет равен SCOPE_profile, SCOPE_web-origins и SCOPE_email. Вы должны изменить свой код на:

.oauth2ResourceServer()
.jwt(customizer -> {
    JwtAuthenticationConverter jwtAuthenticationConverter = new JwtAuthenticationConverter();
    //write your own Converter<Jwt, Collection<GrantedAuthority>> jwtGrantedAuthoritiesConverter 
    //and override Collection<GrantedAuthority> convert(Jwt jwt) to get roles from
    //realm_access.roles
    jwtAuthenticationConverter.setJwtGrantedAuthoritiesConverter(jwtGrantedAuthoritiesConverter);
    customizer.jwtAuthenticationConverter(jwtAuthenticationConverter)
})

или использовать Keycloak Adapter для Spring вместо oauth2ResourceServer()

...