2

在使用容器管理的安全性的 JSF2 / Java EE 6 Web 应用程序中,基于表单的身份验证 (j_security_check) 需要请求一个受保护的页面,之后容器会为您处理登录过程,一旦通过身份验证,就会将浏览器重定向到请求的页面.

在许多常见情况下,这不是您希望应用程序的行为方式。例如,您可能希望拥有同一页面的只读版本和可更新版本。如果用户未登录,您可以在该页面上放置一个“立即登录以编辑”按钮,如果用户已登录,则使字段可编辑。但在两种情况下它都是相同的 JSF 页面,并且该视图不能既不受保护又受保护,因此 j_security_check 似乎无法处理这种情况。

所以,两个问题:

1) 可以操纵 j_security_check 来实现此功能吗?或 2) 如果 j_security_check 不能,JSF / JavaEE webapps 实现这一点的“正常”方式是什么?

4

1 回答 1

1

登录用户也可以在不安全的页面中使用。您可以通过检查是否存在HttpServletRequest#getRemoteUser()和角色检查来执行登录检查,HttpServletRequest#isUserInRole()并相应地呈现受限组件。

例如,仅在用户未登录时显示“登录编辑”按钮:

<h:commandButton 
    value="Login to edit" action="#{auth.login}" 
    rendered="#{empty request.remoteUser}" />

并且仅在用户登录或具有所需角色时显示“编辑”按钮:

<h:commandButton 
    value="Edit" action="#{someBean.edit(someItem)}" 
    rendered="#{not empty request.remoteUser}" />
<!-- or -->
<h:commandButton 
    value="Edit" action="#{someBean.edit(someItem)}" 
    rendered="#{request.isUserInRole('ADMIN')}" />
于 2012-11-28T12:49:34.453 回答