如何在JSF中执行安全性?

Luc*_*uke 16 security jsf java-ee

我正在使用Java EE 6和所有参考实现.为某些页面制定了一些安全约束,例如下面的所有内容/secure/*.这是粗糙的安全性.如果两个用户都具有相同的角色,但同一页面的某些内容应仅对用户"John"可见,那该怎么办?或者应该向"John"显示一个完全不同的页面?我有很多问题没有得到解答,所以如果有人可以提供一些链接/解释或书籍也很好.我需要更精细的安全控制.

MrG*_*mez 25

您希望不仅存在细粒度的安全功能,Oracle甚至还有一篇有用的博客文章,详细介绍了该主题,并附有示例代码.

因为简单地链接文档和运行对我来说是简洁和不礼貌的,接下来是关于如何根据我的理解将这种方式结合起来的一些讨论.

0个问题:粗粒度,声明性安全性

声明性安全性的最大问题是它迫使您在设计时迭代地定义所有用户角色.出于以下两个原因,这是非常不可取的:首先,它无法正确地将您的安全模型从您的实现中抽象出来(未能充分证明您的应用程序未来并打开了信息泄露漏洞的大门),其次,它将您的用户角色束缚到应用程序的直接设计,通常无法在需要或必要时提供细粒度权限或ACL.

实际上,这是一个抽象不足的问题.您正在使用一个能够立即满足您当前需求的系统,但不能在应用程序的生命周期内实现可行或可维护的系统,因为角色变得更加复杂,代码库的复杂性也会不断增加.

使用Managed Beans的细粒度安全性

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

aforelinked文章进入更详细的比我愿意在这里介绍的,所以我强烈建议你阅读博客文章.但这里的外卖是,这样做正确,你应该提供两种认证堆栈和注释层,其中详述权限角色,和你到哪儿去特意明确地连接两个吐温应仅能满足.

定义细粒度的方法调用和有意义的安全策略留给读者练习,但如果您对此方面有疑问,请随时在评论或一系列后续问题中询问他们,如这些问题本身对广大受众有用.

改进

可以想象,这种解决方案不够强大,无法满足您的需求.例如,如果您希望使用LDAPKerberos对用户进行身份验证,以提供用户和角色的统一表示,则这仅提供满足您需求的部分解决方案.在这个领域存在几个很好的 资源,但这是留给读者的练习.

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

但是,对于必须安全正确地满足大量用户需求的大型应用程序,这是正确的方法.它需要更多的知识和开销,但如果你开始正确地做它,它将为你节省大量的时间,精力和挫折感.

一如既往,祝您的申请顺利.


Ano*_*ose 9

最简单的方法是

<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>
Run Code Online (Sandbox Code Playgroud)