0

我正在尝试定义和使用一个BasicRolesAllowed名为

我的类型与快速入门中的类型之间的唯一区别是我的注释必须接受一个字符串数组(我们希望不仅使用一个角色,而且可能使用角色组合来保护方法),因此我的注释是这样定义的:

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(),但上述限制仍然存在。

提前感谢任何可以提供帮助的人。

4

1 回答 1

0

感谢#picketlink (freenode) 上的@pedroigor,可以从此处的纠察链接快速入门中的此类用例示例中收集解决方案。在该文件中,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
    

这解决了我的问题:-)

于 2015-02-12T13:57:30.640 回答