7

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

有谁知道如何防止这种非法访问?

4

4 回答 4

8

为用户分配一个组/角色,并在您的阶段侦听器中进行检查(从技术上讲,这可能是一个简单的 servlet 过滤器,毕竟,阶段侦听器在幕后,对于简单的目的来说非常笨拙并且不会运行在非 JSF URL 上)。

/seller/例如,只允许具有以下角色的用户访问以开头的 URL SELLER

if (url.startsWith("/seller/") && user.getRoles().contains(Role.SELLER)) {
    // Allow access.
} else {
    // Block access.
}

请注意,此功能在许多身份验证框架中提供/内置,例如 Java EE 内置容器管理身份验证和第 3 方库 Apache Shiro。然后,您所需要的只是一个简单的web.xml配置条目<security-constraint>或一些配置文件,例如 Shiro 中的 INI 文件。

也可以看看:

于 2013-02-26T13:41:11.027 回答
1

您可以使用一个文件或其他东西,在其中将每个页面映射到一个用户角色。(某些页面可能可以被超过 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 中。

于 2013-02-26T13:43:54.700 回答
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>
于 2013-02-26T13:41:04.080 回答
0

您需要在直接访问时验证那些在您的页面上导致错误的参数。您可以在 jsf2 中的 prerenderview 事件或 jsf1.2 中的后构造方法中执行此操作

于 2013-02-26T14:35:46.610 回答