通过添加“/ faces / faces”访问JSF2.0中的jdbcRealm安全文件夹

时间:2012-07-08 21:54:23

标签: java-ee jsf-2 glassfish

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

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

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

由于登录表单是JSF,或者初始页面的设计要求至少是外部安全性,因此不能使用“app / faces /”形式的上下文过滤器。

即使用户输入添加的前缀“/ faces”,如何才能保持安全性?

2 个答案:

答案 0 :(得分: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。
  5. 容器必须使用区分大小写的字符串比较来匹配

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

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

    <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 Documentation请参见第12.1节“URL路径的使用”

答案 1 :(得分: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文件夹下的页面(网页/ admin)

<强>更新

只需更改

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

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

并删除security-contrainst中的所有/ faces应解决访问问题(/ faces / faces)。