我试图找出是否可以使用jetty在Java中进行代理身份验证。我已经能够使用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。我正在使用HttpServlets来处理请求/响应。但是,如果我想实现基于代理的身份验证,我该怎么做?
我是否需要使用httpservlet的doGet()并尝试身份验证和显式转发到另一个地址,或者有一种方法使用jetty本身来设置基于代理的身份验证(或代理本地主机服务器),如上面的伪中所示?
我可以获得一些代码帮助来执行基于代理的身份验证,该身份验证可以验证HttpServlet请求并将其转发给另一个servlet /服务器吗?
答案 0 :(得分:0)
对于current version of Jetty (9.3.3.v20150827),Proxy-Authenticate
标头不以任何方式与Servlet约束系统的WWW-Authenticate
标头相关。
从Servlet规范或Jetty实现中没有内置任何东西来支持从Constraint角度来看Proxy-Authenticate
客户端头。
但是,使用Jetty 9.3.x,您可以使用AsyncProxyServlet
,AsyncProxyServlet.Transparent
,AsyncMiddleManServlet
或AsyncMiddleManServlet.Transparent
来处理此Proxy-Authenticate
用你自己的方式标题。
要做到这一点,您首先要从其中一个扩展,然后覆盖sendProxyRequest(HttpServletRequest clientRequest, HttpServletResponse proxyResponse, Request proxyRequest)
。
在您的sendProxyRequest()
版本中,查看clientRequest
和Proxy-Authenticate
的{{1}}标头,并执行最适合您需求的基于代理的身份验证。
如果身份验证通过,请致电Proxy-Authorize
。
否则,请使用super.sendProxyRequest(clientRequest, proxyResponse, proxyRequest);
发送质询回复。