嗨,我实际上是在尝试获取有关非常具体问题的提示或想法。技术背景是 使用JSF 2.1的java web应用程序。
所以我有一个由JSF 2.1提供支持的简单java ee app。结构如下
\webapp
\WEB-INF
\templates
header.xhtml
menu.xhtml
web.xml
\secured
\operation1
op1.xhtml
\operation2
op2.xhtml
\operation3
op3.xhtml
userhome.xhtml
login.xhtml
我有一个@WebFilter
限制了对/secured/*
的访问,以防未设置'user'bean(实际上是一个Session Scoped Bean)。
在登录的同时,我根据用户凭证创建动态菜单。此菜单(MenuItems)指向一个或多个操作(xhtml页面)。
到目前为止,用户登录,菜单是动态的,正在生成链接,点击后他/她可以导航到他/她应该做的任何操作。
我的问题是我无法决定限制访问这些页面的绝对URL的优雅方式。如果user1被'授权'执行operation1而不是operation2或operation3,那么目前我找不到最优雅的方式来检查他的会话状态并应用通用规则(导航规则?),如果实际的web用户,则在url上写入禁止操作的绝对路径。
'/固定/ operation1 / op2.xhtml'
达到这种要求的JSF2最兼容的方式是什么?
我在每个单独的opxx.xhtml
页面上尝试过preRenderView,不幸的是它不起作用+我不喜欢在每次操作时重复它
非常感谢您的提示。
答案 0 :(得分:2)
Web应用程序中的安全性是一个更高级的主题。基本上你有两种方式:
详细解释了如何设置基于容器的安全性here。总而言之,您必须实现一个简单的表单(没有JSF表单!),其中包含用户名和密码字段的特定操作和特定ID。之后,您可以使用web.xml文件轻松限制对特定URL模式的访问。在web.xml文件中,您可以限制对某些用户角色的某些URL模式的访问。从用户名到用户角色的映射由安全领域完成。如何设置安全领域是例如对于Tomcat here。
如果您想自己实现安全性,则必须实现一个ServletFilter来检查所有请求的URL,并转发未登录到您的登录表单的用户,或者在用户获得授权的情况下通过请求。如果用户无权查看该页面,则必须将用户转发到错误页面。由于CDI注入不适用于ServletFilter,因此您必须从HttpSession中查找存储有关您的用户信息(登录,权限)的bean。