【问题标题】:web.xml security constraint combination of rolesweb.xml安全约束角色组合
【发布时间】:2013-02-06 14:07:05
【问题描述】:

鉴于我无法创建任何新角色,因为它们是在 CAS 服务器中创建的,并且我无法控制它们,有没有办法保护 PDF 文件仅在用户同时拥有“客户”时才能打开和“专业”角色?

换句话说,考虑以下三个用户:

user1 只有“客户”角色 user2 具有“客户”和“专业”角色 user3 具有“客户”和“专业”角色 user4 只有“专业”角色

应该只允许 user2 和 user3 查看 PDF。

基本上,我想做这样的事情:

<security-constraint>
    <web-resource-collection>
        <web-resource-name>auth</web-resource-name>
        <url-pattern>/doc/profesionalCustomer.pdf</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>professional,customer</role-name>
    </auth-constraint>
</security-constraint>

这可能吗?

提前致谢

【问题讨论】:

    标签: struts tomcat7 web.xml


    【解决方案1】:

    使用声明式安全(即通过 web.xml)这是不可能的。您只能列出有权访问资源的角色,如下所示:

    <security-constraint>
    <web-resource-collection>
        <web-resource-name>auth</web-resource-name>
        <url-pattern>/doc/profesionalCustomer.pdf</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>professional</role-name>
        <role-name>customer</role-name>
    </auth-constraint>
    

    但是,在这种情况下,您将向所有具有专业或客户角色的用户授予访问权限,这不是您想要的。没有任何构造允许您为具有多个角色的用户授予访问权限。

    您可以采取的一种方法是以编程方式处理它:将客户端引导到一个 servlet,该 servlet 使用HttpServletRequest#isUserInRole(String) 检查用户是否同时具有客户和专业角色,如果是,则将请求转发到默认 servlet它检索pdf。此外,如果您想推迟授予哪些角色组合访问部署时间,而不是在 servlet 中对其进行硬编码,您可以通过 web.xml 的 /web-app/servlet/init-param/web-app/context-param 元素适当地参数化授予 servlet。

    以下是支持这一点的 web.xml 摘录:

    <servlet>
        <servlet-name>PDF Retriever</servlet-name>
        <servlet-class>com.stackoverflow.PDFRetrieverServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>PDF Retriever</servlet-name>
        <url-pattern>/docs/pdf/*</url-pattern>
    </servlet-mapping>
    <security-constraint>
        <web-resource-collection>
            <web-resource-name>PDF Docs - customer and professional only</web-resource-name>
            <url-pattern>/docs/pdf/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>*</role-name>
        </auth-constraint>
    </security-constraint>
    <security-constraint>
        <web-resource-collection>
            <web-resource-name>PDF Docs Private</web-resource-name>
            <url-pattern>/private/pdf/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name />
        </auth-constraint>
    </security-constraint>`
    

    这里是 servlet 的 doGet 编码:

    protected void doGet(HttpServletRequest request, 
        HttpServletResponse response) throws ServletException, IOException {
        if (request.isUserInRole("customer") && request.isUserInRole("professional")) {
             String urlSuffix = request.getPathInfo();
             RequestDispatcher rd = request.getRequestDispatcher("/private/pdf"
                  + urlSuffix);
              rd.forward(request, response);
         } else {
              response.sendError(HttpServletResponse.SC_FORBIDDEN);
         }
    }
    

    【讨论】:

    • 感谢您的回答。我唯一担心的是,如果有人知道 PDF 文件的完整路径,他可以直接访问它而无需任何控制。
    • @Pierpaolo 我编辑了答案以包含 web.xml 和 servlet 代码。为了防止每个人访问 PDF,您将 URL 及其实际位置放在任何角色都无法访问的受保护区域中(您的 pdf 文件将实际位于 /private/pdf 目录下) - 请注意第二个中的空角色名称元素安全约束。唯一可以通过 PDFRetrievalServlet 访问它。
    【解决方案2】:

    我想阅读一些关于这个主题的内容,发现下面的链接非常有用:

    http://www.devarticles.com/c/a/Java/Securing-Struts-Applications/1/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-18
      • 2012-11-23
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多