2017-02-14 6 views
2

Я пытаюсь реализовать собственный фильтр проверки подлинности в Guice. Я получаю токен, получаю имя пользователя и область из токена, а затем создаю Принципала. Теперь я застрял, и я не знаю, как установить Принципала. Было бы неплохо, если бы я мог просто установить его так: request.setUserPrincipal(principal);, но, очевидно, я не могу.Создать принципала в Guice Filter

Как это сделать?

метод

Моего doFilter выглядит следующим образом:

@Override 
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 

    HttpServletRequest request = (HttpServletRequest) servletRequest; 
    String authorizationHeader = request.getHeader(HttpHeaders.AUTHORIZATION); 

    if (authorizationHeader != null && authorizationHeader.length() > 0) { 
     String token = authorizationHeader.substring("Bearer".length()).trim(); 
     if (token.length() > 0) { 
      try { 
       Credentials credentials = securityService.getCredentials(token); 
       String username = credentials.getUsername(); 
       String realm = credentials.getRealm(); 
       Principal principal = new HttpPrincipal(username, realm); 
       // request.setUserPrincipal(principal); 
       LOGGER.info(credentials); 
      } catch (Exception e) { 
       LOGGER.error(e); 
      } 
     } 
    } 

    filterChain.doFilter(servletRequest, servletResponse); 
} 

ответ

1

сервлет спецификация раздел 13,10 говорит:

Контейнер устанавливает личность инициатора запроса до отправляющего запроса в сервлет , Идентификатор вызывающего абонента остается неизменным на протяжении всей обработки запроса или до приложение успешно вызывает аутентификацию, логин или выход из системы в запросе .

Именно по этой причине нет setUserPrincipal.

Но есть хорошие новости. Вы можете предоставить свой собственный getUserPrincipal, потому что вы можете предоставить свой собственный объект HttpServletRequest. Любой сервлет-фильтр может это сделать. Посмотрите на свой код, вы вызываете цепной метод с двумя параметрами: запросом и ответом. Нет необходимости передавать те же объекты, которые вы получаете.

Спецификация даже предоставляет вам вспомогательный класс: HttpServletRequestWrapper. Вы просто создаете свой собственный класс запросов в качестве подкласса оболочки и переопределяете любой метод, который вы хотите, например getUserPrincipal.

Смежные вопросы