未找到PicketLink EL方法

时间:2016-03-18 10:00:47

标签: jsf cdi picketlink

我们在Wildfly的EE7 CDI / JSF应用程序中使用PicketLink 2.7。

根据PicketLink文档,有一些EL方法 比如#{hasRole(' ROLE_NAME')}。当我们尝试在JSF页面中使用它们时

<ui:fragment rendered="#{hasRole('ROLE_NAME')}">

我们得到了

  

引起:javax.el.E​​LException:Function&#39; hasRole&#39;找不到

当我们在带有

的CDI bean上使用EL表达式时
@Restrict("#{hasRole('ROLE_NAME')}")
public void doWhatEver(){}

它工作正常(当它没有角色时抛出异常)。

所以PicketLink拦截器是在beans.xml中配置的,我们在pom文件中使用了对PicketLink的uber依赖。 我们缺少什么?

这些方法由org.picketlink.internal.el.E​​LFunctionMethods提供 据我所知:

    public static boolean hasRole(String roleName)
Checks if an authenticated user is granted with a role with the given name.

This method requires that valid ELEvaluationContext associated with the current invation thread.

1 个答案:

答案 0 :(得分:0)

PicketLink定义的EL表达式在JSF上下文中不可用。我遇到了同样的问题,决定使用@ApplicationScoped bean和所需的方法:

@Named("auth")
@ApplicationScoped
public class AuthorizationManager {
    @Inject Identity identity;
    @Inject PartitionManager partitionManager;

    public void hasRole(String roleName) {
        return AuthorizationUtil.hasRole(identity, this.partitionManager, roleName);
    }
}

然后你可以在JSF中使用它,如:

<ui:fragment rendered="#{auth.hasRole('ROLE_NAME')}">