【问题标题】:Suggestion on JSF authorization关于JSF授权的建议
【发布时间】:2011-10-25 15:26:22
【问题描述】:

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

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

谢谢 菲利波

【问题讨论】:

    标签: jsf role-base-authorization


    【解决方案1】:

    使用 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
    

    然后测试可以用以下形式表达:

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

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

    【讨论】:

    • 如果您不关心 servlet/portlet 环境抽象,#{facesContext.externalContext.isUserInRole('foo')} 可以缩短为 #{request.isUserInRole('foo')}
    【解决方案2】:

    看看Apache Shiro,一个专用的安全框架(据说比 Spring Security 更容易使用)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-10
      • 1970-01-01
      • 2010-11-14
      • 2011-01-28
      • 2012-05-31
      相关资源
      最近更新 更多