在使用容器管理安全性的JSF2 / Java EE 6 Web应用程序中,基于表单的身份验证(j_security_check)需要请求受保护的页面,之后容器会为您处理登录过程,将浏览器重定向到请求的页面经过身份验证。
有许多常见情况,这不是您希望应用程序的行为方式。例如,您可能希望拥有同一页面的只读版本和可更新版本。如果用户未登录,您可以在该页面上放置“立即登录以编辑”按钮,并在用户登录时使字段可编辑。但在两种情况下都是相同的JSF页面,并且该视图不能既不受保护又受保护,因此j_security_check似乎无法处理这种情况。
所以,有两个问题:
1)是否可以操纵j_security_check来实现此功能?要么 2)如果j_security_check不能,那么JSF / JavaEE webapps实现这一目标的“正常”方式是什么?
答案 0 :(得分: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')}" />