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;
}
Существенными изменениями являются:
- Я должен был передать экземпляр контекста вызова
InvocationContext invocationContext
добавив это как параметр в определение моего метода (магия CDI заботится обо всем, что я слышу). Затем я получаю экземпляр аннотации, вызывая:
BasicRolesAllowed basicRolesAllowed = getAnnotation(invocationContext,BasicRolesAllowed.class);
А затем получить значения / параметры, переданные аннотации следующим образом:
String[] requiredRoles = basicRolesAllowed.value();// get these from annotation
Это решает мою проблему:-)