14

いくつかの JAX-RS 2.0 リソース (サーブレット コンテナーで実行されている Jeresey 2.4 を使用) と、@NameBinding アノテーションを介して選択的に適用できる認証と承認を処理するフィルターを作成しました。これはすべてうまくいきます。

この動作を変更するために、実行時にフィルターで使用できるこの注釈 (具体的には、各メソッド/リソースにアクセスするために必要なセキュリティ アクセス許可) でいくつかのパラメーターを定義できるようにしたいと考えています。

インターセプターは javax.ws.rs.ext.InterceptorContext.getAnnotations() を介してこれを実行できることに気付きましたが、javax.ws.rs.container.ContainerRequestContext にはフィルター用の同等のものはありません。これを達成する方法はありますか?次のようなことができるようになりたいです。

@Target({TYPE, METHOD})
@Retention(value = RetentionPolicy.RUNTIME)
@NameBinding
public @interface Secured {
    String[] requiredPermissions() default {};
}

@Secured
@Priority(Priorities.AUTHENTICATION)
public class SecurityRequestFilter implements ContainerRequestFilter {
    @Override
    public void filter(ContainerRequestContext containerRequestContext) throws IOException {
        // extract credentials, verify them and check that the user has required permissions, aborting if not
    }
}

@Path("/userConfiguration/")
public class UserConfigurationResource {
    @GET
    @Produces(MediaType.APPLICATION_XML)
    @Secured(requiredPermissions = {"configuration-permission"})
    public Response getConfig(@Context HttpServletRequest httpServletRequest) {
        // produce a response
    }
}
4

2 に答える 2

7

この情報はUriInfoから取得できます。特に、(Jersey 固有の) ExtendedUriInfoサブインターフェイスです。インスタンスを取得するには、ContainerRequestContext#getUriInfo()を呼び出してキャストします

final ExtendedUriInfo extendendUriInfo = (ExtendedUriInfo) containerRequestContext.getUriInfo();

またはフィルターに挿入します。

@Inject
private ExtendedUriInfo extendendUriInfo;

それから

extendedUriInfo
    .getMatchedResourceMethod()
    .getInvocable()
    .getHandlingMethod().getAnnotation(Secured.class);

2 番目のアプローチでは、DynamicFeatureを実装し、フィルターを特定のリソース メソッドにのみ割り当てることができます (つまり、フィルターの構成がより複雑で、フィルターがいくつかのメソッドにのみ適用され、オーバーヘッドを削減したい場合など)。 )。Jersey のリソース メソッドにセキュリティ アノテーションのサポートを追加するRolesAllowedDynamicFeatureの実装を見てみましょう。

于 2013-11-05T20:53:31.353 に答える