2

我正在使用 Jersey/Tomcat 开发 RESTful 服务。

我需要支持两组公开和私有的 API。公共 API 对所有人开放,并使用 API 密钥进行身份验证。私有 API 将仅从我自己的 WebServer 层调用以执行某些内部操作。

我更喜欢在同一台服务器上托管两组 API,以便我可以有效地管理/扩展它们。

The URIs for the APIs will look some thing like this:
    https://myapis/v1.0/*  --> for public APIs 
    and
    https://myapis/v1.0/secure/*  --> for public APIs

出于安全原因,我想使用客户端证书对私有 API 进行身份验证。即,Web 服务器必须使用安装在 Tomcat 的 trustStore 上的自签名证书调用 secure/* API 调用。

根据我的研究,我发现它可以通过使用 web.xmlJAVA 安全注释来实现

但就我而言,两者都不起作用。

如果我采用 web.xml 路由(我根据证书属性在 tomcat-user.xml 中添加了一个 tomcat 用户),则两个 API 都无法访问(错误 403)

如果我采用注释路由,则无需身份验证即可访问这两个 API。

我遇到了几篇关于该主题的文章,并进行了几次反复试验。但似乎没有一个工作。

什么是正确的方法?

这是我的 web.xml

jersey-serlvet com.sun.jersey.spi.container.servlet.ServletContainer com.sun.jersey.config.property.packages com.mycompany.reststuff 1

<servlet-mapping>
    <servlet-name>jersey-serlvet</servlet-name>
    <url-pattern>/v1.0/*</url-pattern>
</servlet-mapping>

<security-constraint>
    <web-resource-collection>
        <web-resource-name>PuplicAPIs</web-resource-name>
        <url-pattern>/v1.0/*</url-pattern>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
    </web-resource-collection>
    <!-- no auth-constraint -->
</security-constraint>

<security-constraint>
    <web-resource-collection>
        <web-resource-name>PrivateAPIs</web-resource-name>
        <url-pattern>/v1.0/secure/*</url-pattern>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
    </web-resource-collection>
    <auth-constraint>
         <role-name>WebCaller</role-name>    
    </auth-constraint>
</security-constraint>

<security-role>
  <role-name>WebCaller</role-name>
</security-role>
<login-config>
  <auth-method>CLIENT-AUTH</auth-method>
</login-config> ...
4

0 回答 0