Методы PicketLink EL не найдены
Мы используем PicketLink 2.7 в приложении EE7 CDI/JSF с Wildfly.
Согласно документации PicketLink, существуют некоторые методы EL, такие как #{hasRole('ROLE_NAME')}. Когда мы пытаемся использовать их на странице JSF
<ui:fragment rendered="#{hasRole('ROLE_NAME')}">
мы получаем
Вызвано: javax.el.ELException: функция 'hasRole' не найдена
Когда мы используем выражение EL на бине CDI с
@Restrict("#{hasRole('ROLE_NAME')}")
public void doWhatEver(){}
Он работает нормально (исключение, когда у него нет роли).
Таким образом, перехватчик PicketLink настроен в beans.xml, мы используем зависимость uber для PicketLink в файле pom. Чего нам не хватает?
Методы предоставлены 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.
1 ответ
Выражения EL, определенные PicketLink, недоступны в контексте JSF. Я столкнулся с той же проблемой и решил использовать @ApplicationScoped
Боб с необходимыми методами:
@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')}">