我正在使用Apache CXF访问ReST Web服务。因为我是JAAS和Kerberos的新手,所以我从CXF tutorial example开始,经过一些调试和配置,它起了很大的作用。我的程序几乎类似于示例中的程序。
public void doStuff(String uri, String jaasEntryName) {
System.setProperty("java.security.krb5.conf", "c:\Temp\krb5.conf");
System.setProperty("java.security.auth.login.config", "c:\Temp\jaas-login.conf");
WebClient wc = WebClient.create(uri);
KerberosAuthOutInterceptor kbInterceptor = new KerberosAuthOutInterceptor();
AuthorizationPolicy policy = new AuthorizationPolicy();
policy.setAuthorizationType(HttpAuthHeader.AUTH_TYPE_NEGOTIATE);
policy.setAuthorization(jaasEntryName);
kbInterceptor.setPolicy(policy);
WebClient.getConfig(wc).getOutInterceptors().add(kbInterceptor);
Response response = wc.get();
// handle response ...
}
到目前为止,很好,现在,我不仅要访问受Kerberos保护的服务器上的Web服务,而且要访问完全不受保护的服务器上的Web服务。如果我使用此类url照原样调用方法,则会收到异常Caused by: Krb5Exception: Identifier doesn't match expected value (906)
。
是否可以使用上面的方法访问受Kerberos保护的资源和不受Kerberos保护的网站?
当我使用KerberosAuthOutInterceptor
时,我猜想CXF要使用Kerberos,我正在寻找一种配置CXF的方法,尽管使用了拦截器,但它不应该这样做(即,如果我配置jaas-login。正确配置)。
我的可悲的尝试使其生效:
我编辑了jaas-login.conf并添加了一个带有可选Krb5Module的条目,希望它不会选择性地执行Kerberos
optional-kerberos {
com.sun.security.auth.module.Krb5LoginModule optional;
}
我创建了javax.security.auth.spi.LoginModule
的实现,该实现只返回true
。
public class NoAuthenticationLoginModule {
public void initialize(Subject s, CallbackHandler c, Map m, Map o) {/*do nothing*/}
public boolean login() {return true;}
public boolean commit() {return true;}
public boolean about() {return true;}
public boolean logout() {return true;}
}
我的想法都不起作用。有谁有更好的一个?