2015-09-11 112 views
0

我想知道是否有可能在Java中使用码头进行代理身份验证。我已经能够做到基本的使用码头摘要身份验证方案和有简便的方法在码头设置使用伪代码,因为这这些认证方案:使用码头代理身份验证

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); 

同样的摘要式身份验证__BASIC_AUTH可以__DIGEST_AUTH更换。我正在使用HttpServlets来处理请求/响应。但是,如果我想实现基于代理的身份验证,我该如何做到这一点?

我是否需要使用httpservlet的doGet()并尝试验证和显式转发到另一个地址,或者有没有一种方法使用jetty本身来设置基于代理的身份验证(或代理本地主机服务器) ?

我可以得到一些帮助代码做基于代理的身份验证,并验证并转发HttpServlet请求到另一个servlet /服务器?

+0

使用'org.mortbay.jetty'意味着您使用*古代*版本的Jetty,早在EOL(End of Life)之后。 Jetty项目在2009年转移到Eclipse基金会,并将其包装更改为'org.eclipse.jetty' –

回答

0

对于current version of Jetty (9.3.3.v20150827),该Proxy-Authenticate头球以任何方式向WWW-Authenticate头,该Servlet的约束系统有关。

从约束的角度来看,没有内置到Servlet规范或Jetty实现中以支持Proxy-Authenticate客户机标头。

但是,使用码头9.3.x可以使用的AsyncProxyServletAsyncProxyServlet.TransparentAsyncMiddleManServlet,或AsyncMiddleManServlet.Transparent有在你自己的条件来处理这个Proxy-Authenticate头的一种手段。

要做到这一点,您需要先从其中一个延伸,然后重写sendProxyRequest(HttpServletRequest clientRequest, HttpServletResponse proxyResponse, Request proxyRequest)

在你的sendProxyRequest()版本,看看clientRequest标头Proxy-AuthenticateProxy-Authorize,并执行最适合您需要的基于代理的认证。

如果认证通过,请致电super.sendProxyRequest(clientRequest, proxyResponse, proxyRequest);

否则使用proxyResponse发送挑战响应。

+0

感谢您告诉我这个!所以看来我需要实现sendProxyRequest方法。然而,与发送HTTP请求时自动调用的doGet()不同,该方法是如何从客户端调用的,并且此代理服务器的url在哪里指定?另外,您是否知道代理验证是否可以通过这种方式轻松地选择基本或摘要作为方案? – avish

+0

我继续提交了一个改进请求,提供了一个可以覆盖此行为的更好方法 - https://bugs.eclipse.org/477201 –