【问题标题】:<security-constraint> <url-pattern> and the * character within web.xml<security-constraint> <url-pattern> 和 web.xml 中的 * 字符
【发布时间】:2014-05-16 23:14:01
【问题描述】:

使用 Spring for Security,我可以使用以下代码运行程序。

<intercept-url pattern="/web/admin**/**" access="ROLE_ADMIN" requires-channel="https"/>
<intercept-url pattern="/web/**/" access="ROLE_USER,ROLE_ADMIN" requires-channel="https"/>

我目前正在尝试在 web.xml 中执行此操作。使用 JBOSS 部署 .war 文件。以下是我所拥有的, url 模式是导致我在第一个安全约束中出现问题的原因。这些页面位于并命名为 /web/adminarchive /web/adminsettings /web/adminstuff 等... Spring 中的上面代码按照我想要的方式处理它,url 是 /web/admin**/** 以捕获所有管理页面。我注释掉了 /* 部分,因为我知道它可以工作,只留下管理员一个。使用该结构不会引发任何错误,它根本不会提示登录。

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

【问题讨论】:

    标签: war web.xml jboss6.x url-pattern security-constraint


    【解决方案1】:

    根据Java Servlet 3.1 Specification,第 12.2 章,映射定义如下:

    在 Web 应用程序部署描述符中,以下语法是 用于定义映射:

    • 以“/”字符开头并以“/*”后缀结尾的字符串用于路径映射。
    • 以“*.”前缀开头的字符串用作扩展映射。
    • 空字符串 ("") 是一种特殊的 URL 模式,它精确映射到应用程序的上下文根,即表单的请求
      HTTP://主机:端口//。在这种情况下,路径信息是 '/'
      并且 servlet 路径和上下文路径是空字符串(“”)。
    • 仅包含“/”字符的字符串表示应用程序的“默认”servlet。在这种情况下,servlet 路径是
      请求 URI 减去上下文路径,路径信息为空。
    • 所有其他字符串仅用于完全匹配。

    最后一个约束:

    所有其他字符串仅用于完全匹配。

    据我了解,您不能使用 ** 通配符来指代子目录,因为它将是一个特定的匹配项。

    看来&lt;url-pattern&gt;/web/admin/*&lt;/url-pattern&gt; 应该可以了。

    【讨论】:

    • 刚刚测试过了。 /web/admin/* 的工作方式与 /web/admin 完全相同,因为它只在实际页面 /web/ 上进行提示管理员如果我尝试点击任何其他页面,即。 /web/adminsettings ,它会在没有提示的情况下进入页面。 (清除缓存并确保我没有登录)。如果有帮助,使用 JBOSS 将应用程序部署为 .war 文件。把它排除在原始问题之外。如果我尝试转到 /web/admin/something 页面,这确实会触发提示,但这不是 web-app 使用的 url 的结构。
    • 您是指/web/adminsettings 还是/web/admin/settings?因为前者是行不通的。 Servlet 不会让您以这种方式使用通配符。 JBoss 在底层使用 Tomcat 分支,其行为应该与规范相同。在我看来,如果您想使用 Servlet 规范而不是 Spring,则需要再添加一层路径,例如 /web/admin/settings
    猜你喜欢
    • 2020-03-27
    • 2013-08-02
    • 2013-08-02
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    • 2012-01-29
    • 2013-08-17
    相关资源
    最近更新 更多