Picketlink: Как получить параметры аннотации и имя функции, декорированное при использовании @Secures?

Я пытаюсь определить и использовать пользовательский тип привязки безопасности под названием BasicRolesAllowed, как показано в кратких руководствах по Picketlink здесь.

Единственное отличие между моим типом и тем, что в кратком руководстве, заключается в том, что моя аннотация должна принимать массив строк (мы хотим защитить методы, используя не одну, а, возможно, комбинацию ролей), и поэтому моя аннотация определяется следующим образом:

public @interface BasicRolesAllowed {
    String[] value() default {};
}

Следуя краткому руководству, я попытался определить, как этот декоратор аутентифицируется как таковой:

@Secures
@BasicRolesAllowed
public boolean doAdminCheck(Identity identity, IdentityManager identityManager, RelationshipManager relationshipManager) throws Exception {
    /*
     Sample usage of @BasicRolesAllowed is like:
      @BasicRolesAllowed(value = RoleConstants.CREATE_USER)
      TODO: need to get these from the @BasicRolesAllowed annotation instance/usage
      */

    String[] requiredRoles = {};// get these from annotation
    boolean isAuthorized = true;

    for (String role : requiredRoles)
        isAuthorized = isAuthorized && hasRole(relationshipManager, identity.getAccount(), getRole(identityManager, role));

    return isAuthorized;
}

И, как видно из фрагмента, хитрость заключается в следующем:

        String[] requiredRoles = {};// get these from annotation

Как мне передать строковые константы в аннотацию декорированного метода, чтобы я мог использовать их при поиске ролей?

Некоторые советы:

На аналогичный вопрос есть ответ здесь, но проблема в том, что в этом решении; нужно знать имя декорируемой функции или класса, что в моем случае невозможно, учитывая, что декоратор будет использоваться практически везде, и я не знаю, как получить их с помощью метода, показанного в краткий обзор Picketlink.

Кроме того, решение показывает только, как получить значение, переданное в аннотацию, ожидая только 1 строку - возможно, я мог бы попробовать использовать values(), но указанное выше ограничение все еще стоит на моем пути.

Заранее спасибо всем, кто может помочь.


person nemesisfixx    schedule 12.02.2015    source источник


Ответы (1)


Благодаря @pedroigor на #picetlink (freenode), решение можно почерпнуть из примера такого варианта использования в кратком руководстве по пикетлинку здесь. В этом файле определен метод getAnnotation(), имеющий сигнатуру:

private <T extends Annotation> T getAnnotation(InvocationContext invocationContext, Class<T> annotationType)

Итак, используя этот метод, я могу провести самоанализ и получить значения, переданные в мою аннотацию, как можно увидеть в моей новой реализации метода проверки ролей здесь:

@Secures
@BasicRolesAllowed
public boolean hasBasicRolesCheck(InvocationContext invocationContext, Identity identity, IdentityManager identityManager, RelationshipManager relationshipManager) throws Exception {
    BasicRolesAllowed basicRolesAllowed = getAnnotation(invocationContext,BasicRolesAllowed.class);

    String[] requiredRoles = basicRolesAllowed.value();// get these from annotation
    boolean isAuthorized = true;

    for (String role : requiredRoles)
        isAuthorized = isAuthorized && hasRole(relationshipManager, identity.getAccount(), getRole(identityManager, role));

    return isAuthorized;
}

Существенными изменениями являются:

  1. Мне пришлось передать экземпляр контекста вызова InvocationContext invocationContext, добавив this в качестве параметра в определение моего метода (магия CDI позаботится обо всем остальном, что я слышу).
  2. Затем я получаю экземпляр аннотации, вызывая:

    BasicRolesAllowed basicRolesAllowed = getAnnotation(invocationContext,BasicRolesAllowed.class);
    
  3. И затем получите значения/параметры, переданные в аннотацию, таким образом:

    String[] requiredRoles = basicRolesAllowed.value();// get these from annotation
    

Это решает мою проблему :-)

person nemesisfixx    schedule 12.02.2015