阻止用户访问每个wsdl元素

时间:2016-07-06 17:10:08

标签: java spring web-services soap wsdl

我有一个SOAP Web服务,其中包含许多不同的操作。我试图阻止所有用户访问它们。我试图通过编辑web.xml文件安全性约束来实现这一点。

假设我的服务有操作1,2和3.我有user1和user2。我希望user1能够访问1,2和3. user2应该只能访问3.我设置了两个具有不同角色的安全约束。

     <security-constraint>
        <web-resource-collection>
        <web-resource-name>SOAP Service</web-resource-name>
            <url-pattern>/*</url-pattern>
            <http-method>DELETE</http-method>
            <http-method>POST</http-method>
            <http-method>PUT</http-method>
        </web-resource-collection>
        <auth-constraint>
            <role-name>user1</role-name>
        </auth-constraint>
    </security-constraint>

    <security-constraint>
        <web-resource-collection>
        <web-resource-name>SOAP Service</web-resource-name>
            <url-pattern>/*</url-pattern>
            <http-method>DELETE</http-method>
            <http-method>POST</http-method>
            <http-method>PUT</http-method>
        </web-resource-collection>
        <auth-constraint>
            <role-name>user2</role-name>
        </auth-constraint>
    </security-constraint>

这很好,允许user1和user2访问wsdl公开的所有内容,然后我尝试通过更改url-pattern进一步限制user2可以做什么。

<security-constraint>
    <web-resource-collection>
        <web-resource-name>SOAP Service</web-resource-name>
        <url-pattern>/3/*</url-pattern>
        <http-method>DELETE</http-method>
        <http-method>POST</http-method>
        <http-method>PUT</http-method>
    </web-resource-collection>
    <auth-constraint>
        <role-name>user2</role-name>
    </auth-constraint>
</security-constraint>

不幸的是,这不起作用。我被告知这是因为它是一个肥皂请求,并且所有请求都在同一个网址上?所以我现在被困住了。允许某些用户只能访问wsdl部分的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

不得不做一堆研究,因为我对网络服务并不是很了解。最后我所拥有的是一个驻留在tomcat容器中的Web服务,我使用web.xml中配置的基本身份验证与tomcat-users.xml中的用户。 web.xml看起来像

<security-constraint>
    <web-resource-collection>
        <web-resource-name>SOAP Service</web-resource-name>
        <url-pattern>/*</url-pattern>
        <http-method>DELETE</http-method>
        <http-method>POST</http-method>
        <http-method>PUT</http-method>
    </web-resource-collection>
    <auth-constraint>
        <role-name>serviceUsers</role-name>
    </auth-constraint>
</security-constraint>

<security-constraint>
    <web-resource-collection>
        <web-resource-name>SOAP Service</web-resource-name>
        <url-pattern>/*</url-pattern>
        <http-method>DELETE</http-method>
        <http-method>POST</http-method>
        <http-method>PUT</http-method>
    </web-resource-collection>
    <auth-constraint>
        <role-name>otherUsers</role-name>
    </auth-constraint>
</security-constraint>

<security-role>
    <role-name>serviceUsers</role-name>
</security-role>

<security-role>
    <role-name>otherUsers</role-name>
</security-role> 

这可以防止任何人作为一个整体访问该服务,除非他们具有serviceUsers或otherUsers角色。我想做什么阻止每个操作。要做到这一点,我必须编辑我的serviceEndpointImpl。我添加了什么

@Resource
private WebServiceContext context;

if (context.isUserInRole("webServiceUsers")) { 
   //do whatever that user should be able to do or block them.
}

这样做是基于他们使用的tomcat-user.xml用户名和密码来获取连接到服务的用户的角色。使用这个我能够在容器级别保持身份验证,但仍然拒绝用户访问我不希望他们使用的方法。