关于JSF授权的建议

关于JSF授权的建议,jsf,role-base-authorization,Jsf,Role Base Authorization,我学习了如何在JDBC领域中使用容器身份验证。 我在互联网上搜索了很多,但除了下面的文章之外,我找不到任何关于JSF授权的内容。 我的目标是避免使用直接链接访问受保护的页面,并根据经过身份验证的用户权限显示/隐藏菜单项和表单组件。 最后一部分可以使用JSF标记的rendered属性实现,但在创建自己的脏的、高耦合的解决方案之前,我想知道是否有一些特定的最佳实践或库可以提供帮助。事实上,要有条件地呈现的组件数量非常多,我不想为每个组件编写特定的函数。 也许我可以为每个经过身份验证的用户创建一个包

我学习了如何在JDBC领域中使用容器身份验证。 我在互联网上搜索了很多,但除了下面的文章之外,我找不到任何关于JSF授权的内容。

我的目标是避免使用直接链接访问受保护的页面,并根据经过身份验证的用户权限显示/隐藏菜单项和表单组件。 最后一部分可以使用JSF标记的rendered属性实现,但在创建自己的脏的、高耦合的解决方案之前,我想知道是否有一些特定的最佳实践或库可以提供帮助。事实上,要有条件地呈现的组件数量非常多,我不想为每个组件编写特定的函数。 也许我可以为每个经过身份验证的用户创建一个包含所有条件呈现组件的名称(id)的映射,以及一个包含字符串参数(组件的唯一名称/id)的函数。这是个好主意吗?我有什么选择? 我不想在项目中添加其他通用框架,比如spring,因为它只使用了其中的一小部分(安全框架)

谢谢
Filippo

看一看,这是一个专用的安全框架(据说比Spring security更易于使用)。

使用Java EE 6中的表达式语言版本,您应该能够使用如下表达式:

<h:inputText rendered="#{facesContext.externalContext.isUserInRole('foo')}" />

对于旧版本,您可以创建以下形式的托管bean:

public class RoleMap implements Map<String, Boolean> {

    public Boolean get(Object key) {
        ExternalContext extCtxt = FacesContext.getCurrentInstance()
                                              .getExternalContext();
        return extCtxt.isUserInRole(key.toString());
    }

    //TODO: other methods; mostly throwing UnsupportedOperationException
公共类RoleMap实现映射{
公共布尔get(对象键){
ExternalContext extCtxt=FacesContext.getCurrentInstance()
.getExternalContext();
返回extCtxt.isUserInRole(key.toString());
}
//TODO:其他方法;主要抛出UnsupportedOperationException
然后,测试可以用以下形式表示:

<h:inputText rendered="#{roleMap['foo']}" />

第三方框架提供了其他选项,例如Apache Tomahawk库的
visibleOnUserRole
组件属性。

{facesContext.externalContext.isUserInRole('foo')}
如果不关心servlet/portlet环境抽象,可以缩短为
{request.isUserInRole('foo')}