通过直接更改JSF中的URL来限制用户访问页面

时间:2013-02-26 13:33:40

标签: java jsf authorization

我的应用程序中有两种用户 - 客户和卖家。我在JSF中使用PhaseListener来防止用户在没有登录的情况下访问页面,但是在他们登录后我不知道如何阻止用户更改位置栏中的URL并访问他不是的页面也允许。例如,阻止客户访问卖家页面。

有没有人知道如何防止此类非法访问?

4 个答案:

答案 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构造方法中执行此操作