поделиться пользовательским контекстом между перехватчиком и бизнес-уровнем весной oauth2 (приложение sso) - PullRequest
0 голосов
/ 09 мая 2018

У меня вопрос, возникший из-за прочтения множества примеров от пользователя 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 на своем бизнес-уровне, установить его в фильтре и использовать на бизнес-уровне? это плохая картина?

1 Ответ

0 голосов
/ 14 мая 2018

Насколько я понимаю, ваша архитектура, вы разрабатываете это:

  • Rest API, который должен быть защищен JWT.

и вы хотите это:

  • Доступ к пользовательской информации, полученной во входящем JWT, на вашем бизнес-уровне.

Если оба вышеприведенных предположения верны, вам следует прочитать о том, как это делает Spring в своей микросервисной архитектуре. прочтите это для быстрого старта:

https://dzone.com/articles/json-web-tokens-with-spring-cloud-microservices

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...