2

PathAuthorizerURL がユーザーに許可されているかどうかを確認する Picketlink インターフェイスのカスタム実装があります。

public class BssPathAuthorizer implements PathAuthorizer {

    @Inject
    Identity identity;

    @Override
    public boolean authorize(PathConfiguration pathConfiguration, 
                             HttpServletRequest request, 
                             HttpServletResponse response) {

        if (identity != null){

            LOG.log(Level.FINE, "Identity loggato: {0}", identity.isLoggedIn());
            String uri = request.getRequestURI();
            String contextpath = request.getContextPath();
            LOG.log(Level.FINE, "URI: {0}, context path: {1}", 
                new Object[]{uri, contextpath});

            Method m = findMethod(uri);
            ...
        }

でメソッドを取得した後findMethod()、いくつかの注釈を確認trueし、ユーザーに権限があるかどうかを返します。

  • 要求された URL (例: ) から Java メソッドを取得する簡単な方法はあります.../user/editか?

  • それを実装するクラス メソッドは何ですか (たとえばUserManager.edit())?

4

1 に答える 1

2

JAX-RS から必要な情報は、ResourceInfoインターフェースで入手できます。

Picketlink のPathAuthorizer実装でこの情報を利用できるようにする方法については、以下を参照してください。

必要なデータを格納するクラスを定義する

@RequestScopedターゲット クラスとメソッドを格納するアノテーションが付けられたクラスを定義します。

@RequestScoped
public class RequestTarget {

    private Class<?> targetClass;
    private Method targetMethod;

    // Default constructor, getters and setters ommited
}

パッケージの@RequestScoped注釈を使用していることを確認してください。javax.enterprise.context

リクエスト フィルタの作成

を作成しContainerRequestFilterて に入力しRequestTargetます。

@Provider
@Priority(1)
public class RequestTargetPopulator implements ContainerRequestFilter {

    @Context
    private ResourceInfo resourceInfo;

    @Inject
    private RequestTarget target;

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {
        target.setTargetClass(resourceInfo.getResourceClass());
        target.setTargetMethod(resourceInfo.getResourceMethod());
    }
}

値の@Priority注釈1により、このフィルターが他のフィルターの前に実行されることが保証されます。

注射の実施

RequestTargetそして、最終的にusingのインジェクションを実行できます@Inject:

public class CustomPathAuthorizer implements PathAuthorizer {

    @Inject
    private RequestTarget target;

    @Override
    public boolean authorize(PathConfiguration pathConfiguration, 
                             HttpServletRequest request, 
                             HttpServletResponse response) {

        Class<?> targetClass = target.getTargetClass();
        Method targetMethod = target.getTargetMethod();

        ...
    }
}
于 2016-04-08T12:36:09.667 に答える