2017-04-18 5 views
0

これらの質問Best practice for REST token-based authentication with JAX-RS and Jerseyに従って開発したREST APIのフィルタを作成しようとしています。JAX-RS/RESTEasyアプリケーションでContainerRequestFilterが実行されない

問題は、私がフィルタを呼び出すメソッドが動作しているように見えることです。

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

01:

これらは私のクラスであります

@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'は[name binding annotation](http://stackoverflow.com/a/38523942/1426227)です。フィルタを1つまたは複数のリソースクラスおよび/またはメソッドにバインドします。 –

+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のインストールでは、再構築のモジュールでした。 – A1t0r

関連する問題