Hi All,

I am trying to add kerberos support to a web servlet via hadoop authentication 
classes. This is to make this web servlet server to authenticate its client via 
kerberos. I assume this should work. Right?

The whole design is to add AuthFilter at server side and 
AuthenticatedURL.injectToken(conn, currentToken) during create connection at 
client side.  But the process failed at KerberosName.rules, I made a fix based 
on 2.0.4-alpha branch. Could you please help to review it and give some 
suggestions? I think with this fix, we can add kerberos support to any web 
servlet via hadoop authentication classes. I have opened HADOOP-9679 to trace 
this issue and applied the patch.

Error:
The process failed during AuthenticationFilter.doFilter,  with following error:
java.lang.NullPointerException
        at 
org.apache.hadoop.security.KerberosName.getShortName(KerberosName.java:384)
        at 
org.apache.hadoop.security.authentication.server.KerberosAuthenticationHandler$2.run(KerberosAuthenticationHandler.java:328)
        at 
org.apache.hadoop.security.authentication.server.KerberosAuthenticationHandler$2.run(KerberosAuthenticationHandler.java:302)
        at 
java.security.AccessController.doPrivileged(AccessController.java:310)
        at javax.security.auth.Subject.doAs(Subject.java:573)
        at 
org.apache.hadoop.security.authentication.server.KerberosAuthenticationHandler.authenticate(KerberosAuthenticationHandler.java:302)
        at 
org.apache.hadoop.security.authentication.server.AuthenticationFilter.doFilter(AuthenticationFilter.java:340)


Root cause:
this error happened because KerberosName.rules are not initialized. I found 
that this parameter only be initialized during initialize UserGroupInformation 
which is used for manager hadoop user and group. Then this parameter will be 
initialized during hadoop client(like oozie) access hadoop. But the servlet I 
am testing is not hadoop client, then current there is no place for 
initializing it. But I think we should make it work via value 
KerberosName.rules with default value "DEFAULT".

FIX:
Following is my draft fix based on hadoop-2.0.4-alpha branch, with this fix, my 
test web servlet can support kerberos now.
--- 
a/hadoop-common-project/hadoop-auth/src/main/java/org/apache/hadoop/security/authentication/server/KerberosAuthenticationHandler.java
+++ 
b/hadoop-common-project/hadoop-auth/src/main/java/org/apache/hadoop/security/authentication/server/KerberosAuthenticationHandler.java
@@ -308,6 +308,10 @@ public AuthenticationToken run() throws Exception {
               } else {
                 String clientPrincipal = gssContext.getSrcName().toString();
                 KerberosName kerberosName = new KerberosName(clientPrincipal);
+                if( !KerberosName.hasRulesBeenSet()){
+                    LOG.warn("No rules applied to " + kerberosName.toString() 
+ ". Using DEFAULT rules.");
+                    KerberosName.setRules("DEFAULT");
+                }
                 String userName = kerberosName.getShortName();
                 token = new AuthenticationToken(userName, clientPrincipal, 
getType());
                 response.setStatus(HttpServletResponse.SC_OK);


Reply via email to