2

Java EE、JAX-RS、Jersey を使用して API を作成しています。これを行う際に、独自のセキュリティ コンテキストとセキュリティ フィルターを実装しました。

このような質問を見ると (ジャージーでアップロードされたファイルの MIME タイプを取得する方法) @Secure アノテーションを見てきましたが、それは何をしますか? ユーザーが特定のメソッドにアクセスする権利を持っているかどうかを確認するために @RolesAllowed が行うのと同じ方法で、セキュリティ コンテキストの isSecure メソッドをクエリするアノテーションであることが私の望みでした。もしそうなら、アノテーションを使ってそうする方法はありますか、それとも @Context を使用してセキュリティコンテキストを取得することに固執していますか?

4

1 に答える 1

1

@Secure注釈はカスタムのもののようです。JAX-RS/Jersey は、そのままではこのような機能をサポートしていませんが、実装はそれほど難しくありません。独自の@Secureアノテーションがあり、このアノテーションでアノテーションが付けられたメソッドに対して通信チャネルが安全かどうかを確認したいとします。そのようなメソッドに特別なフィルターを割り当てるカスタムResourceFilterFactoryを作成する必要があります。

public class IsSecureResourceFilterFactory implements ResourceFilterFactory {

    private class IsSecureFilter implements ResourceFilter, ContainerRequestFilter {

        // ResourceFilter

        @Override
        public ContainerRequestFilter getRequestFilter() {
            return this;
        }

        @Override
        public ContainerResponseFilter getResponseFilter() {
            return null;
        }

        // ContainerRequestFilter

        @Override
        public ContainerRequest filter(final ContainerRequest request) {
            // Check whether the channel is secure.
            if (request.isSecure()) {
                return request;
            }

            // Throw an exception if it's not.
            throw new WebApplicationException(Response.Status.FORBIDDEN);
        }
    }

    @Override
    public List<ResourceFilter> create(final AbstractMethod abstractMethod) {
        // Add IsSecureFilter for resource methods annotated with @Secure annotation (ignore other resource methods).
        return abstractMethod.isAnnotationPresent(Secure.class)
                ? Collections.<ResourceFilter>singletonList(new IsSecureFilter()): null;
    }
}

ここで、これについてジャージーに伝える必要がありますResourceFilterFactory。2 つの方法があります。

  • 経由web.xml

    <init-param>
        <param-name>com.sun.jersey.spi.container.ResourceFilters</param-name>
        <param-value>my.package.IsSecureResourceFilterFactory</param-value>
    </init-param>
    
  • META-INF/servicesまたはメカニズムを介して-META-INF/services/com.sun.jersey.spi.container.ResourceFilterFactoryファクトリの完全修飾名(この場合はmy.package.IsSecureResourceFilterFactory)を含むというファイルを作成し、このファイルがアプリケーションのクラスパスにあることを確認する必要があります。

于 2013-08-21T08:11:28.600 に答える