2017-02-22 62 views
0

Я следую этому руководству Best practice for REST token-based authentication with JAX-RS and Jersey, и я нахожусь в части фильтра.Фильтр Auth в OSGi?

Я использую OSGI, и я не знаю, как зарегистрировать свой фильтр. Я создал свой фильтр и создаю свой проект без ошибок. Я развернул свой пакет в karaf, но мои службы @Secured не были защищены, потому что фильтр не вызывается ...

Должен ли я добавить свой фильтр в активатор? В плане? (Я новичок в OSGi мире)

Вот мой фильтр:

@Secured 
@Provider 
@Priority(Priorities.AUTHENTICATION) 
public class AuthenticationFilter implements ContainerRequestFilter { 
    private static Logger LOGGER = LoggerFactory.getLogger(AuthenticationFilter.class); 
    @Override 
    public void filter(ContainerRequestContext requestContext) throws IOException { 
     LOGGER.info("[AuthenticationFilter] started"); 
     // Get the HTTP Authorization header from the request 
     String authorizationHeader = 
      requestContext.getHeaderString(HttpHeaders.AUTHORIZATION); 

     // Check if the HTTP Authorization header is present and formatted correctly 
     if (authorizationHeader == null || !authorizationHeader.startsWith("Bearer ")) { 
      throw new NotAuthorizedException("Authorization header must be provided"); 
     } 

     // Extract the token from the HTTP Authorization header 
     String token = authorizationHeader.substring("Bearer".length()).trim(); 

     try { 
      // Validate the token 
      validateToken(token); 
     } catch (Exception e) { 
      requestContext.abortWith(Response.status(Response.Status.UNAUTHORIZED).build()); 
     } 
     LOGGER.info("[AuthenticationFilter] ended"); 
    } 

    //TODO: add the key in properties 
    //TODO: check the username in DB 
    private void validateToken(String token) throws Exception { 
     // Check if it was issued by the server and if it's not expired 
     // Throw an Exception if the token is invalid 
     String username = Jwts.parser() 
      .setSigningKey("jeSuisLaSecretPhrase,1234,ilFaudraMePlacerEnConf,Merci") 
      .parseClaimsJws(token) 
      .getBody() 
      .getIssuer(); 
     if(!"admin".equals(username)){ 
      throw new NotAuthorizedException("bad token"); 
     } 

    } 
} 

EDIT

Karaf не может загрузить "http://cxf.apache.org/blueprint/jaxrs" Вот мой план:

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0" 
    xmlns:jaxrs="http://cxf.apache.org/blueprint/jaxrs"> 

    <!-- Beans declaration --> 
    <bean id="AuthenticationServlet" class="com.mycompanie.fr.core.servlets.jaxrs.impl.AuthenticationServletImpl"> 
     <property name="service" ref="service" /> 
    </bean> 
    <service ref="AuthenticationServlet" interface="com.mycompanie.fr.core.servlets.jaxrs.AuthenticationServlet" /> 

    <bean id="CommitmentServlet" class="com.mycompanie.fr.core.servlets.jaxrs.impl.CommitmentServletImpl"> 
     <property name="service" ref="service" /> 
    </bean> 
    <service ref="CommitmentServlet" interface="com.mycompanie.fr.core.servlets.jaxrs.CommitmentServlet" /> 


    <!-- Dependency definition --> 
    <reference id="service" interface="com.mycompanie.fr.core.api.services.MainService" /> 

    <jaxrs:providers> 
     <ref bean="AuthenticationFilter" /> 
    </jaxrs:providers> 
    <bean id="AuthenticationFilter" class="com.mycompanie.fr.core.servlets.filter.AuthenticationFilter"/> 


    <web-spa xmlns="http://www.mycompanie.com/xmlns/web-spa/v1.0.0" context="/myProject"> 
     <service ref="AuthenticationServlet" /> 
     <service ref="CommitmentServlet" /> 
    </web-spa> 

</blueprint> 
+0

Как вы можете воспользоваться услугой REST? Используете ли вы план и пространство имен CXF или что-то еще, например CXF-DOSGi? –

+0

Я использую план –

ответ

2

Try для добавления фильтра, как описано в документах CXF JAX-RS filter.

... 
<jaxrs:providers> 
    <ref bean="authorizationFilter" /> 
</jaxrs:providers> 
... 
<bean id="authorizationFilter" class="com....AuthenticationFilter"> 
+0

в моем проекте? –

+0

Я добавил xmlns: jaxrs = "http://cxf.apache.org/blueprint/jaxrs" и те строки в моем проекте, но теперь karaf log say "1.8.0.SNAPSHOT ждет обработчиков пространства имен [http: // cxf .apache.org/blueprint/jaxrs] " –

+0

Пространство имен jaxrs уже должно быть в вашем проекте, поскольку вы должны каким-то образом экспортировать службу. Можете ли вы опубликовать свой полный пример на github или аналогичном? –