我们在Wildfly的EE7 CDI / JSF应用程序中使用PicketLink 2.7。
根据PicketLink文档,有一些EL方法 比如#{hasRole(' ROLE_NAME')}。当我们尝试在JSF页面中使用它们时
<ui:fragment rendered="#{hasRole('ROLE_NAME')}">
我们得到了
引起:javax.el.ELException:Function&#39; hasRole&#39;找不到
当我们在带有
的CDI bean上使用EL表达式时@Restrict("#{hasRole('ROLE_NAME')}")
public void doWhatEver(){}
它工作正常(当它没有角色时抛出异常)。
所以PicketLink拦截器是在beans.xml中配置的,我们在pom文件中使用了对PicketLink的uber依赖。 我们缺少什么?
这些方法由org.picketlink.internal.el.ELFunctionMethods提供 据我所知:
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.
答案 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')}">