Основное имя сервера ресурсов загрузки Spring

#java #spring #spring-boot #oauth #keycloak

#java #spring #spring-boot #oauth #скрытый ключ

Вопрос:

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

Информация о JWT

   ...
  "scope": "openid profile email",
  "email_verified": true,
  "username": "test@test.com",
  "DOB": "12345",
  "name": "test test",
  "preferred_username": "test@test.com",
  "given_name": "test",
  "family_name": "test",
  "email": "test@test.com"
}
 

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

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

Комментарии:

1. Как вы получаете директора школы?

2. @dreamcrash У меня есть простой контроллер Rest с методом get. @GetMapping(«/») @PreAuthorize(«hasAnyRole(‘ПОЛЬЗОВАТЕЛЬ’)») частный участник я (Основной участник){}

Ответ №1:

 @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);
    }
}
 

Комментарии:

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

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

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

4. @dreamcrash тай за твою помощь <3

5. Как вы решили проблему без соответствующего компонента JwtDecoder ? Получение той же ошибки,.

Ответ №2:

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);
    }