我的应用程序中有两种用户 - 客户和卖家。我在JSF中使用PhaseListener
来防止用户在没有登录的情况下访问页面,但是在他们登录后我不知道如何阻止用户更改位置栏中的URL并访问他不是的页面也允许。例如,阻止客户访问卖家页面。
有没有人知道如何防止此类非法访问?
答案 0 :(得分:8)
为用户分配一个组/角色,并在你的阶段监听器中检查它(这在技术上可能更好地是一个简单的servlet过滤器,毕竟,一个阶段监听器在幕后是非常笨拙的,只是为了简单的目的而且没有不运行非JSF URL。
,例如,只允许角色为/seller/
的用户访问以SELLER
开头的网址:
if (url.startsWith("/seller/") && user.getRoles().contains(Role.SELLER)) {
// Allow access.
} else {
// Block access.
}
请注意,此功能在许多身份验证框架中提供/内置,例如Java EE内置容器管理身份验证和第三方库Apache Shiro。您只需要一个简单的web.xml
配置条目<security-constraint>
或一些配置文件,例如Shiro中的INI文件。
答案 1 :(得分:1)
使用Filter
。创建实现javax.servlet.Filter
接口的类,并在doFilter()
方法中检查用户的角色,如果用户没有角色,则将其重定向到某个自定义页面。在web.xml
中为此过滤器添加定义和映射:
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>mypackage.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>*.xhtml</url-pattern>
</filter-mapping>
答案 2 :(得分:1)
你可以使用一个文件或者用你的用户编程映射每个页面的东西。(一些用户可以访问一些页面) 例如:
<entry key="acl_page_sub/page1">client,seller</entry>
<entry key="acl_page_sub2/page1">client</entry>
<entry key="acl_page_sub2/page2">seller</entry>
然后定义某种LoginController类,在其中检查currentuserrole和请求的页面(url)。如果没有被授予,则重定向到自定义错误页面或登录页面或其他任何内容。
您可以将此logincontroller类添加到facesconfig中的phaselistener。
答案 3 :(得分:0)
您需要在直接访问时验证那些导致页面导致错误的参数。您可以在jsf2中的prerenderview事件或jsf1.2中的post构造方法中执行此操作