我正在使用 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.xml或JAVA 安全注释来实现
但就我而言,两者都不起作用。
如果我采用 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> ...