1

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

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

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

我们得到

原因:javax.el.E​​LException:找不到函数“hasRole”

当我们在 CDI bean 上使用 EL 表达式时

@Restrict("#{hasRole('ROLE_NAME')}")
public void doWhatEver(){}

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

所以在 beans.xml 中配置了 PicketLink 拦截器,我们在 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.
4

1 回答 1

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')}">
于 2018-02-27T14:00:22.077 回答