2014-01-24 4 views
7

В настоящее время я разрабатываю приложение с использованием JAX-RS для Джерси в качестве backend и AngularJS в качестве интерфейса; Мне нужна аутентификация, и поэтому с каждым запросом я посылаю токен, который должен проверяться с помощью бэкэнд. Для этого я решил создать фильтр Джерси, который будет искать этот токен, а затем вызвать мой AuthenticateService, чтобы проверить, может ли пользователь быть аутентифицирован. После этого авторизация управляется аннотацией @RolesAllowed.Inject EJB in Jersey фильтр

Вот моя проблема: я не могу привнести в EJB внутри Джерси фильтра, strangly, потому что он прекрасно работает с ресурсами .. Но с фильтром, служба всегда остается нулевой

Любая идея, как обмануть его? Благодаря код

Фильтр:

@Provider 
@Priority(Priorities.AUTHORIZATION) 
public class AuthenticationFilter implements ContainerRequestFilter { 

    @EJB(name=AuthenticationService.LOOKUP_NAME) 
    private AuthenticationService authService; 

    @Override 
    public void filter(ContainerRequestContext requestContext) throws IOException { 
     /** 
     * Get headers parameters 
     */ 
     String userIdStr = requestContext.getHeaderString(SecurityConsts.HEADER_ID_PARAMETER); 
     int userId = 0; 

     if(userIdStr != null && !userIdStr.isEmpty()) { 
      userId = Integer.parseInt(userIdStr); 
     } 

     String securityToken = requestContext.getHeaderString(SecurityConsts.HEADER_TOKEN); 

     User user = null; 

     /** 
     * If a token is present, try to authenticate the user 
     */ 
     if(securityToken != null && !securityToken.isEmpty()) { 
        // NullPointerException happens here 
      user = authService.authenticateWithToken(userId, securityToken); 
     } 

     /** 
     * Set correct security context 
     */ 
     requestContext.setSecurityContext(new ConfiguratorSecurityContext(user)); 
    } 

} 

ответ

13

Это более или менее знают проблему.

JAX-RS 2.0 не поддерживает инъекцию EJBs в JAX-RS компонентов (поставщики, ресурсы).

Но есть некоторые варианты решения этой проблемы.

  • Вы можете попробовать переключиться на CDI, например. превратив ваше обслуживание в @ManagedBean и используя @Inject.

  • Вы можете попытаться получить услугу с помощью контекстного поиска, что-то вроде этого:

    InitialContext context = new InitialContext(); 
    context.lookup("java:comp/env/ejb/YourBean"); 
    
  • Вы также можете попробовать аннотировать фильтр с @Stateless поэтому он получает управляемый контейнером.

Вы можете найти родственные JIRAs here и here.

Смотрите также:

+0

Трюк с 'InitialContext' решить мою проблему, спасибо! –