1

我有带有 jdbcRealm 安全文件夹secureuser 和secureadmin 的Web 应用程序项目(NetBeans 7.1.2+GlassFish 3.1.2)。jdbc 安全性是通常的表单登录,增加了安全性约束。Glassfish 部署描述符和 web.xml 像往常一样定义。Servlet 配置是默认的“/faces/*”。

尝试访问“localhost8080/app/faces/secureduser/”形式的 url 时,安全性按预期工作。但是,如果另外使用“localhost8080/app/faces/faces/secureduser/”,则会绕过安全性。其他安全文件夹也是如此。

向安全约束中定义的 url 模式添加“/faces”,[因此,如果定义的模式是“/faces/secureduser”,则添加“/faces/faces/secureduser”]似乎总是覆盖安全性。

由于登录表单是 JSF,或者初始页面的设计要求至少超出了安全范围,因此无法使用对表单“app/faces/”的上下文进行过滤。

即使用户键入添加的前缀“/faces”,如何维护安全性?

4

2 回答 2

0

这是 Servlet 3.0 规范中关于如何完成 URL 路径匹配的一段:

The first successful match is used with no further matches attempted:
  1. 容器将尝试找到请求路径与 servlet 路径的完全匹配。成功的匹配选择 servlet。
  2. 容器将递归地尝试匹配最长的路径前缀。这是通过使用“/”字符作为路径分隔符一次将路径树下移一个目录来完成的。最长的匹配决定了选择的 servlet。
  3. 如果 URL 路径中的最后一段包含扩展名(例如 .jsp),则 servlet 容器将尝试匹配处理扩展请求的 servlet。扩展名被定义为最后一个'.'之后的最后一段的一部分。特点。
  4. 如果前三个规则都没有导致 servlet 匹配,则容器将尝试提供适合所请求资源的内容。如果为应用程序定义了一个“默认”servlet,它将被使用。许多容器为服务内容提供了一个隐式的默认 servlet。

容器必须使用区分大小写的字符串比较进行匹配

因此,完全匹配优先于前缀,前缀优先于扩展,最后是通用模式。

所以你可以做的只是添加一个/*没有指定角色的通用映射。通用映射最后匹配,如果没有指定角色,任何人都不能像这样访问资源:

<security-constraint>
    <web-resource-collection>
      <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <auth-constraint />
</security-constraint>

<!--No Authorization Required -->
<security-constraint>
    <web-resource-collection>
      <url-pattern>/faces/index.xhtml</url-pattern>
    </web-resource-collection>
</security-constraint>

<!--All roles can access -->
<security-constraint>
    <web-resource-collection>
      <url-pattern>/faces/users.xhtml</url-pattern>
    </web-resource-collection>
    <auth-constraint>
      <role-name>*</role-name>
    </auth-constraint>
</security-constraint>

Servlet 3.0 文档请参阅第 12.1 节 URL 路径的使用

于 2012-07-08T23:50:40.017 回答
0

由于您尚未发布代码,因此无法弄清楚问题所在,请查看以下博客

http://jugojava.blogspot.in/2011/02/jdbc-security-realm-with-glassfish-and.html

您的 web.xml 是您指定页面访问权限的位置

前任:

<security-constraint>
    <web-resource-collection>
        <web-resource-name>admin</web-resource-name>
        <url-pattern>/admin/*</url-pattern>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
    </web-resource-collection>
    <auth-constraint>
        <role-name>ADMIN</role-name>
    </auth-constraint>
</security-constraint>

在上面的例子中,只有 admin 用户可以访问 admin 文件夹下的页面(Web pages/admin)

更新

只需通过更改

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

我已将默认 /faces/ 更改为 *.xhtml。

并且还从安全约束中删除所有 /faces 应该解决访问问题(/faces/faces)。

于 2012-07-09T12:29:40.923 回答