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