2017-04-18 59 views
0

我正在嘗試爲以下這些問題開發的REST API創建篩選器Best practice for REST token-based authentication with JAX-RS and JerseyContainerRequestFilter不在JAX-RS/RESTEasy應用程序中執行

問題是我調用過濾器似乎無法正常工作的任何方法。

這些都是我的課:

Secured.java

@NameBinding 
@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.TYPE, ElementType.METHOD}) 
public @interface Secured { 

} 

AuthenticationFilter.java

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

    @Override 
    public void filter(ContainerRequestContext requestContext) throws IOException { 
     // 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()); 
     } 
    } 

    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 
    } 

} 

RestService.java

@Path("/test") 
public class RestService { 

TestDAO testDAO; 

    @GET 
    @Secured 
    @Path("/myservice") 
    @Produces("application/json") 
    public List<Test> getEverisTests() { 
     testDAO=(TestDAO) SpringApplicationContext.getBean("testDAO"); 

     long start = System.currentTimeMillis(); 

     List<Test> ret = testDAO.getTests(); 

     long end = System.currentTimeMillis(); 

     System.out.println("TIEMPO TOTAL: " + (end -start)); 

     return ret; 

    } 
} 

RestApplication.java

public class RestApplication extends Application{ 
    private Set<Object> singletons = new HashSet<Object>(); 

    public RestApplication() { 
     singletons.add(new RestService()); 
     singletons.add(new AuthenticationFilter()); 
    } 

    @Override 
    public Set<Object> getSingletons() { 
     return singletons; 
    } 
} 

我失去了一些東西?提前致謝。

+0

確保您的'AuthenticationFilter'已註冊。你的'Application'子類是什麼樣的? –

回答

0

的解決方案是以下resteasy這個頁面並選擇我用的是RestEasy的版本更新RestEasy的Jboss的的模塊。

感謝您的答覆!

0

我還不能發表評論所以這將進入一個答案:

我不明白@Secured機制是如何工作的。您是否嘗試刪除所有@Secured註釋?過濾器應該對所有端點都有效。

如果它仍然無法正常工作,您可能需要在應用程序中手動註冊它。

如果它之後你至少有上哪裏尋找這個問題的提示工作...

+1

「@ Secured」是[名稱綁定註釋](http://stackoverflow.com/a/38523942/1426227)。它將過濾器綁定到一個或多個資源類和/或方法。 –

+1

很酷,我忽略了@NameBinding註釋。謝謝! – martinw

1

AuthenticationFilter可能未註冊。

很可能你在你的應用程序的某個地方有一個Application子類。用它來登記過濾器:

@ApplicationPath("api") 
public class ApiConfig extends Application { 

    @Override 
    public Set<Class<?>> getClasses() { 
     HashSet<Class<?>> classes = new HashSet<>(); 
     classes.add(AuthenticationFilter.class); 
     ... 
     return classes; 
    } 
} 
+0

感謝您的回答!我的過濾器被註冊在我的應用程序子類中。問題是jboss安裝中的resteasy模塊。 – A1t0r

相關問題