Основное имя сервера ресурсов Spring Boot

У меня работает сервер Keycloak. и приложение весенней загрузки в качестве сервера ресурсов. Я могу пройти аутентификацию и получить токен, и приложение весенней загрузки примет токен. но когда я хочу получить имя пользователя от принципала, я получу UUID вместо своего адреса электронной почты или имени пользователя. Я также добавил в свой keycloak сопоставитель, который сопоставляет предпочитаемое_имя_пользователя с именем пользователя. и это работает.

Информация JWT

  ...
  "scope": "openid profile email",
  "email_verified": true,
  "username": "[email protected]",
  "DOB": "12345",
  "name": "test test",
  "preferred_username": "[email protected]",
  "given_name": "test",
  "family_name": "test",
  "email": "[email protected]"
}

мои свойства весеннего приложения:

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          issuer-uri: http://localhost:8080/auth/realms/test

Как вы получаете принципала?

dreamcrash 10.12.2020 22:23

@dreamcrash У меня есть простой контроллер Rest с методом get. @GetMapping("/") @PreAuthorize("hasAnyRole('USER')") частный Принципал я (Основной принципал){}

Rea Teria 10.12.2020 22:28
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
1 018
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
@Configuration
@EnableWebSecurity
@ComponentScan(basePackageClasses = KeycloakSecurityComponents.class)
public class JWTSecurityConfig extends KeycloakWebSecurityConfigurerAdapter {
    
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider();
        keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());
        auth.authenticationProvider(keycloakAuthenticationProvider);
    }

    @Bean
    public KeycloakConfigResolver KeycloakConfigResolver() {
        return new KeycloakSpringBootConfigResolver();
    }

    /**
     * Defines the session authentication strategy.
     */
    @Bean
    @Override
    protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
        return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
          .authorizeRequests(authz -> authz
            .anyRequest().permitAll().permitAll())
          .oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt);
    }
}

можете ли вы удалить .oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt); из вашего кода и протестирован с кодом, который я предоставил

dreamcrash 10.12.2020 22:55

я получаю эту ошибку: нет подходящего компонента типа «org.springframework.security.oauth2.jwt.JwtDecoder»

Rea Teria 10.12.2020 23:00

Неважно, вы уже решили свою проблему, верно?

dreamcrash 10.12.2020 23:01

@dreamcrash, спасибо за помощь <3

Rea Teria 10.12.2020 23:02

Нет проблем, рад, что это помогает

dreamcrash 10.12.2020 23:02

Как вы решили проблему с No Qualification bean JwtDecoder? Получение той же ошибки,.

Mejmo 13.01.2021 14:40

@mejmo Я перешел на fusionAuth, но думаю, вам следует добавить зависимость spring-boot-starter-keycloak

Rea Teria 13.01.2021 19:43

Spring Security сохраняет токен JWT в качестве принципала в SecurityContextHolder. Например, следующий код вернет искомое имя пользователя.

...
import org.springframework.security.oauth2.jwt.Jwt;
...
@GetMapping(value = "current-user", produces = "application/json")
    ResponseEntity<String> getLoggedInUser() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        Jwt principal = (Jwt) authentication.getPrincipal(); 
        String currentUserName = principal.getClaimAsString("username");
        return new ResponseEntity<String>(currentUserName, HttpStatus.OK);
    }

Другие вопросы по теме