Идиоматический путь
Идиоматический способ в Spring Security заключается в использовании UserDetailsService
или реализации ваших собственных :
public class MyUserDetailsService implements UserDetailsService {
@Autowired
MyUserRepository myUserRepository;
public UserDetails loadUserByUsername(String username) {
return this.myUserRepository.findById(username);
}
}
Кроме того, в Spring Security DSL есть несколько мест, где их можно разместить в зависимости от ваших потребностей.
После интеграции с методом аутентификации, который вы используете (в данном случае OAuth 2.0), вы можетебыть в состоянии сделать:
public void endpoint(@AuthenticationPrincipal MyUser myuser) {
}
Быстрый, но менее гибкий способ
Как правило, это лучше делать во время аутентификации (когда выясняется Принципал), а не в методе.время разрешения (с использованием преобразователя аргументов), поскольку оно позволяет использовать его в большем количестве сценариев аутентификации.
Тем не менее, вы также можете использовать преобразователь аргументов @AuthenticationPrincipal
с любым зарегистрированным компонентом, например
public void endpoint(
@AuthenticationPrincipal(expression="@myBean.convert(#this)") MyUser user)
{
}
...
@Bean
public Converter<Principal, MyUser> myBean() {
return principal -> this.myUserRepository.findById(p.getName())
}
Компромисс заключается в том, что это преобразование будет выполняться при каждом вызове этого метода.Поскольку ваше приложение не имеет состояния, это может и не быть проблемой (поскольку поиск должен выполняться по каждому запросу в любом случае), но это будет означать, что этот контроллер, вероятно, не может быть повторно использован в других профилях приложения.