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(), но вышеупомянутое ограничение все еще стоит на моем пути.

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

1 ответ

Благодаря @pedroigor в #picketlink (freenode) решение можно найти на примере такого варианта использования в кратком обзоре picketlink здесь. В этом файле метод 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 добавив это как параметр в определение моего метода (магия CDI заботится обо всем, что я слышу).
  2. Затем я получаю экземпляр аннотации, вызывая:

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

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

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

Другие вопросы по тегам