Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Security 如何在JSF中实现安全性?_Security_Jsf_Jakarta Ee - Fatal编程技术网

Security 如何在JSF中实现安全性?

Security 如何在JSF中实现安全性?,security,jsf,jakarta-ee,Security,Jsf,Jakarta Ee,我在所有参考实现中使用JavaEE6。对某些页面(如/secure/*下的所有内容)进行了一些安全约束。这是粗粒度的安全性。如果两个用户都具有相同的角色,但同一页面的某些内容应该仅对用户“John”可见,例如,该怎么办?或者一个完全不同的页面应该显示给“John”?我有很多问题没有回答,所以如果有人能提供一些链接/解释或者相关书籍,那就太好了。我需要更细粒度的安全控制。最简单的方法是 <h:panelGroup rendered="#{request.userPrincipal.name

我在所有参考实现中使用JavaEE6。对某些页面(如
/secure/*
下的所有内容)进行了一些安全约束。这是粗粒度的安全性。如果两个用户都具有相同的角色,但同一页面的某些内容应该仅对用户“John”可见,例如,该怎么办?或者一个完全不同的页面应该显示给“John”?我有很多问题没有回答,所以如果有人能提供一些链接/解释或者相关书籍,那就太好了。我需要更细粒度的安全控制。

最简单的方法是

<h:panelGroup rendered="#{request.userPrincipal.name == 'user1'}">
    <p>Content for user 1</p>
</h:panelGroup>
<h:panelGroup rendered="#{request.userPrincipal.name == 'user2'}">
    <p>Content for user 2</p>
</h:panelGroup>

用户1的内容

用户2的内容


通常,此类内容将保存在会话变量中。因此,您不必考虑用户登录了什么。

您希望的细粒度安全功能不仅存在,甚至Oracle也存在,并提供了完整的示例代码

因为我简单地链接文档并运行是简明扼要和不礼貌的,所以下面就我所理解的如何将它们结合在一起进行一些讨论

第0个问题:粗粒度的声明式安全性 最大的问题是它迫使您在设计时迭代定义所有用户角色。这是非常不可取的,原因有两个:第一,它无法正确地将您的安全模型从实现中抽象出来(无法充分利用您的应用程序并打开信息泄露漏洞的大门),第二,它将您的用户角色与应用程序的即时设计捆绑在一起,通常无法提供细粒度权限,或者在需要或必要时无法提供

实际上,这是一个抽象不足的问题。您使用的系统可以立即满足您当前的需求,但在应用程序的整个生命周期中,您不能期望它是可行的或可维护的,因为角色变得越来越复杂,代码库的复杂性也在稳步增加

使用托管bean的细粒度安全性 这里的一阶解决方案是使用一个抽象模型,该模型允许您在每个JSF方法调用的上下文中独立定义用户角色,允许您根据需要交换它们。另外,这允许您定义更细粒度的权限,因为这样的方案允许您定义每个方法的权限,而不是每个视图、每个端点或每个bean的权限。如果角色改变了呢?您只需要在单个位置更新权限模型,而不需要转到每个bean并交换它们的用户定义

这篇文章涉及的细节远比我想在这里介绍的要多,所以我强烈推荐阅读这篇博文。但这里的要点是,要正确地做到这一点,您应该同时提供一个身份验证堆栈和一个注释层,详细说明权限角色,而这两个层只应在您显式地有意地将两者连接在一起的情况下才会相遇

定义细粒度的方法调用和有意义的安全策略留给读者作为练习,但如果您在这方面有问题,请在评论或一组后续问题中自由提问,因为这些问题对于广泛的受众来说本质上是有用的

改进 可以想象,此解决方案不足以满足您的需求。例如,如果您希望使用或提供用户和角色的统一表示对用户进行身份验证,这仅提供部分解决方案来满足您的需要。在这个领域中存在一些,但这是留给读者的练习

这里的最终收获是,在完美的世界中,这就是应该如何定义应用程序安全性。您的需求可能会有所不同,对于小规模的产品,简单的声明式安全性可能可以满足您的需求。毕竟,这就是它继续存在的原因

但是,对于必须安全、正确地满足大量用户需求的大型应用程序来说,这是正确的选择。它需要更多的知识和开销,但如果你一开始就做得好,它会为你节省大量的时间、精力和挫折


一如既往,祝你的应用程序好运。

显示同一页面的多个版本与安全无关(不同版本!=链接隐藏),限制访问和要求额外授权是,如果你不介意,我会回答这个问题

您可以阅读这两方面的内容(身份验证、授权)。在我看来,这也是最好的框架。掌握它需要一些时间,但在那之后,它就相当容易了,你甚至会意识到它根本不重-你不会被迫使用每一项功能。(就像EJB一样)

JAAS甚至可以使用ldap或windows帐户记录您的日志,甚至支持多个身份验证步骤-您可以实现pass+sms登录。当然,你也可以这样做(只是没那么容易)

因为您已经提到了JSF,JAAS比acegi更适合,所以您可以使用@RolesAllowed注释任何支持bean,如果用户会话不满足要求,将抛出SecurityException。这适用于servlet和bean(ejb,backing),而不适用于JSP(不过无论如何它没有多大意义)

您可以阅读,但如果您已经在考虑,请不要错过——它构建在安全注释和JAAS之上,而且使用起来非常上瘾。值得一读


顺便说一句:我不是妓女,只是发现了一个有趣的问题,所以。。。请随意为赏金而战:)

这是怎么回事:我有一个名为
profile.xhtml
的页面和一个名为
username
的请求参数。如果用户转到
profile.xhtml?username=Amanda
且未以Amanda身份登录,则他/她将获得有限的配置文件视图。现在,你会这么做吗?在视图代码或can y中进行这些检查