我试图找出是否有可能在Java中使用jetty进行代理身份验证。我已经能够使用jetty执行基本和摘要身份验证方案,并且在jetty中有简单的方法可以使用以下伪代码设置这些身份验证方案:
constraint = org.mortbay.jetty.security.Constraint();
constraint.setName(constraint.('__BASIC_AUTH'))
constraint.setRoles({'admin'});
constraint.setAuthenticate(true);
constraintMapping = ConstraintMapping();
constraintMapping.setConstraint(constraint);
constraintMapping.setPathSpec('/*');
securityHandler = SecurityHandler();
securityHandler.setUserRealm(myrealm);
securityHandler.setConstraintMappings(constraintMapping );
类似地,对于DIGEST身份验证__BASIC_AUTH可以替换为__DIGEST_AUTH。我使用httpservlet来处理请求/响应。但是,如果我想实现基于代理的身份验证,我该怎么做呢?
我是否需要使用httpservlet的doGet()并尝试身份验证和显式转发到另一个地址,或者是否有一种方法使用jetty本身来设置基于代理的身份验证(或代理本地主机服务器),如上面的pseudo所示?
我可以得到一些帮助的代码做基于代理的身份验证,验证和转发HttpServlet请求到另一个servlet/服务器?
对于当前版本的Jetty (9.3.3.v20150827), Proxy-Authenticate
标头与Servlet约束系统的WWW-Authenticate
标头没有任何关系。
从约束的角度来看,Servlet规范或Jetty实现中没有内置任何内容来支持Proxy-Authenticate
客户端标头。
但是,使用Jetty 9.3。您可以使用AsyncProxyServlet
, AsyncProxyServlet.Transparent
, AsyncMiddleManServlet
或AsyncMiddleManServlet.Transparent
来按照自己的方式处理这个Proxy-Authenticate
标头。
要做到这一点,您将从其中一个扩展开始,然后覆盖sendProxyRequest(HttpServletRequest clientRequest, HttpServletResponse proxyResponse, Request proxyRequest)
。
在您的sendProxyRequest()
版本中,查看Proxy-Authenticate
和Proxy-Authorize
的clientRequest
标头,并执行最适合您需求的基于代理的身份验证。
如果认证通过,则调用super.sendProxyRequest(clientRequest, proxyResponse, proxyRequest);
。
否则使用proxyResponse
发送回挑战响应