Я использую Spring Boot 2.2.5 с Spring Security 5.2.2 с использованием spring-security-oauth2-resource-server
и spring-security-oauth2-jose
зависимостей.
В моих методах контроллера у меня это работает:
@GetMapping
public ResponseEntity<?> doSomething(@AuthenticationPrincipal JwtAuthenticationToken principal) {
User user = getUser(principal);
...
}
principal
вводится и содержит идентификатор пользователя на Azure (я использую Azure AD B2 C).
Первое, что мне нужно сделать в каждом методе, это получить мой собственный User
объект, используя этот приватный метод, который извлекает User
из моего userService
Spring bean-компонента:
private User getUser(JwtAuthenticationToken principal) {
AuthorizationServerUserId authorizationServerUserId = AuthorizationServerUserId.fromPrincipal(principal);
return userService.findByAuthorizationServerUserId(authorizationServerUserId)
.orElseThrow(() -> UserNotFoundException.forAuthorizationServerUserId(authorizationServerUserId));
}
Как настроить Spring (Boot) так, чтобы это работало:
@GetMapping
public ResponseEntity<?> doSomething(@AuthenticationPrincipal User user) {
}
В настоящее время настройка безопасности выполняется следующим образом:
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt)
.authorizeRequests(registry -> {
registry.antMatchers("/registration/**").permitAll();
registry.antMatchers("/api/**").authenticated();
});
}
}