【问题标题】:Authorization in JSF2 componentsJSF2 组件中的授权
【发布时间】:2013-07-17 14:55:33
【问题描述】:

在我们的项目中,我们有用于公司内部网络的 JSF2 页面。但是我们将把这些页面打开到互联网上。因此,每个人都可以使用页面。但是如果用户来自互联网,一些字段将不会被渲染。

我知道可以为每个组件编写一个渲染属性,例如“userIsInRole”。但是额外的“渲染”控件似乎不是一种高效且优雅的方法。所以我打算通过使用自定义属性来标记将要在线渲染的组件,如下所示:

<h:inputText context="internet" />
...

在inputText或组件代码的渲染器中:

if(user is from Internet && context = "internet") {
    return true; // or render... whatever
}

如果组件未标记为 Internet,则意味着它只能从公司内部使用(呈现)。

是否可以根据给定的属性使用JSF2组件来实现授权?有没有更好的选择?还是应该为互联网用户设计单独的页面?

我们在项目中使用:PrimeFaces + Spring。

谢谢

【问题讨论】:

    标签: jsf-2 primefaces authorization


    【解决方案1】:

    这太荒谬了。最终使用的努力有什么不同

    <h:inputText context="internet" />
    

    <h:inputText rendered="#{intranet}" />
    

    ?

    如果您唯一的问题是每次都需要重复整个条件,最终导致像这样的丑陋代码

    <h:inputText rendered="#{not (user.hasRole('internet') and context eq 'internet')}" />
    <h:inputText rendered="#{not (user.hasRole('internet') and context eq 'internet')}" />
    <h:inputText rendered="#{not (user.hasRole('internet') and context eq 'internet')}" />
    ...
    

    然后将条件重构为单个请求范围变量

    <c:set var="intranet" value="#{not (user.hasRole('internet') and context eq 'internet')}" scope="request" />
    ...
    <h:inputText rendered="#{intranet}" />
    <h:inputText rendered="#{intranet}" />
    <h:inputText rendered="#{intranet}" />
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-29
      • 2021-08-06
      • 2021-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-03
      • 1970-01-01
      相关资源
      最近更新 更多