3

我有一个使用 web.xml 来配置其安全性的 java webapp:

<security-constraint>
    <web-resource-collection>
        <web-resource-name>webPages</web-resource-name>
        <description>All web resources</description>
        <url-pattern></url-pattern>
        <url-pattern>/admin/*</url-pattern>
        <http-method>POST</http-method>
        <http-method>GET</http-method>
    </web-resource-collection>
    <auth-constraint>
        <role-name>admins</role-name>
    </auth-constraint>
    <user-data-constraint>
        <description>SSL not required</description>
        <transport-guarantee>NONE</transport-guarantee>
    </user-data-constraint>
</security-constraint>

我希望 /admin/* 下的所有页面都受到保护,这很有效。用户首先正确地看到一个登录屏幕,然后被重定向到原始请求的页面。

我还希望我的上下文根受到保护:http://host:port/context/但是,当我配置模式<url-pattern></url-pattern>并向根发出请求时,我的 java 控制器刚刚开始工作并显示视图而用户从未看到登录屏幕。为什么这种模式适用于<servlet-mapping>(将请求映射到 spring servlet)之类的事情,但不能作为安全约束?

我在 chrome 和 firefox 中都试过,并重新启动了多次。

4

1 回答 1

0

您可以尝试白名单方法,这意味着仅授予对公共资源的访问权限。

这是一个更好的示例答案,但在您的情况下应该是这样的:

<security-constraint>
  <web-resource-collection>
    <web-resource-name>webPages</web-resource-name>
    <description>All web resources</description>
    <url-pattern>/</url-pattern>
    <http-method>POST</http-method>
    <http-method>GET</http-method>
  </web-resource-collection>
  <auth-constraint>
    <role-name>admins</role-name>
  </auth-constraint>
  <user-data-constraint>
    <description>SSL not required</description>
    <transport-guarantee>NONE</transport-guarantee>
  </user-data-constraint>
</security-constraint>
<security-constraint>   
  <web-resource-collection>
    <web-resource-name>Public Resources</web-resource-name>
    <url-pattern>/public/*</url-pattern>
    <url-pattern>/alsopublic</url-pattern>
    <url-pattern>...an so on...</url-pattern>
  </web-resource-collection>  
  <!-- to given public access don't set auth-constraint-->
</security-constraint>

编辑:参考servlet 3 规范

于 2016-07-02T12:07:46.480 回答