У меня вопрос, возникший из-за прочтения множества примеров от пользователя Spring и oauth2, но по-прежнему не удается выполнить некоторые базовые концепции, возможно, кто-то может указать мне правильные указания / примеры или информацию для чтения.
, поэтому я пытаюсь создать приложение API на основе отдыха.
для доступа к конечным точкам они будут защищены токеном JWT, и идея заключается в том, что токен используется для единого входа в нескольких других приложениях.
Моя первоначальная идея состояла в том, чтобы иметь несколько перехватчиков фильтра аутентификации, которые обрабатывают токен, чтобы я мог хранить любую дополнительную информацию, которая мне может понадобиться, а затем использовать этого пользователя на реальном уровне бизнеса моих сервисов.
Я реализовал некоторые AuthenticationFiler, который реализует фильтр
и я могу получить дополнительную информацию после прочтения доступа к токену из своего хранилища токенов.
Теперь моя первая проблема начинается с того, что большинство примеров начинаются со страницы входа в систему / выхода из системы, и, поскольку у меня больше настроек API, у меня действительно нет этого потока.
Во-вторых, в большинстве случаев кажется, что получить пользователя можно из принципала (SecurityContextHolder.getContext (). GetAuthentication (). GetPrinciple ()) примерно так, но мой принципал всегда равен нулю, не уверен, что это потому, что Я на самом деле не знаю, из-за того, что это из-за состояния или против того или иного рода.
Итак, мои самые большие проблемы - понять, как я могу делиться информацией о пользователях между моим перехватчиком безопасности и моим бизнес-уровнем. может быть, этот вопрос не столько о весне как таковой, и мне не хватает дополнительных базовых знаний, но, возможно, кто-то может дать мне несколько советов.
это мой фильтр аутентификации, я хочу знать, как я могу создать пользовательский экземпляр так же, как я могу использовать MDC для хранения пользовательской информации.
В идеале я хотел бы создать там пользовательский экземпляр и просто передать его на бизнес-уровень. я могу сделать это с Autowire?
@Component
@Order(Ordered.LOWEST_PRECEDENCE)
public class AuthenticationFilter implements Filter {
@Autowired
TokenStore tokenStore;
@Autowired
JwtAccessTokenConverter accessTokenConverter;
@Override
public void init(FilterConfig filterConfig) {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication != null) {
if (authentication instanceof OAuth2Authentication) {
OAuth2Authentication oAuth2Authentication = (OAuth2Authentication) authentication;
OAuth2AuthenticationDetails oauth2AuthenticationDetails = (OAuth2AuthenticationDetails)oAuth2Authentication.getDetails();
OAuth2AccessToken oAuth2AccessToken = tokenStore.readAccessToken(oauth2AuthenticationDetails.getTokenValue());
Object decodedDetails = oauth2AuthenticationDetails.getDecodedDetails();
Map<String, Object> additionalInformation = oAuth2AccessToken.getAdditionalInformation();
MDC.put("sub", additionalInformation.get("sub").toString());
MDC.put("preferred_username", additionalInformation.get("preferred_username").toString());
}
}
try {
chain.doFilter(request, response);
}
finally {
MDC.remove("sub");
MDC.remove("preferred_username");
}
}
@Override
public void destroy() {
}
}
не уверен, что это мое неправильное понимание, но я думаю, что я ищу инъекции зависимостей.
каким-то образом я хочу создать новый пользовательский компонент, заполнить его в моем фильтре и использовать в другом месте.
Я думаю, я мог бы создать @autowire на своем бизнес-уровне, установить его в фильтре и использовать на бизнес-уровне?
это плохая картина?