У меня работает сервер 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 У меня есть простой контроллер Rest с методом get. @GetMapping("/") @PreAuthorize("hasAnyRole('USER')") частный Принципал я (Основной принципал){}
@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); из вашего кода и протестирован с кодом, который я предоставил
я получаю эту ошибку: нет подходящего компонента типа «org.springframework.security.oauth2.jwt.JwtDecoder»
Неважно, вы уже решили свою проблему, верно?
@dreamcrash, спасибо за помощь <3
Нет проблем, рад, что это помогает
Как вы решили проблему с No Qualification bean JwtDecoder? Получение той же ошибки,.
@mejmo Я перешел на fusionAuth, но думаю, вам следует добавить зависимость spring-boot-starter-keycloak
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);
}
Как вы получаете принципала?