Gabriel39 commented on code in PR #69608:
URL: https://github.com/apache/doris/pull/69608#discussion_r4374031354


##########
fe/fe-kerberos/src/main/java/org/apache/doris/kerberos/HadoopKerberosAuthenticator.java:
##########
@@ -47,38 +50,86 @@ public class HadoopKerberosAuthenticator implements 
HadoopAuthenticator {
     private long nextRefreshTime;
     private UserGroupInformation ugi;
 
-    // The authentication method the first caller published to the 
process-wide UGI configuration.
-    // Guarded by HadoopKerberosAuthenticator.class; null until the first 
setConfiguration.
-    private static UserGroupInformation.AuthenticationMethod 
configuredAuthMethod = null;
+    // Hadoop's rule grammar keeps whitespace inside a regex or substitution 
distinct from rule separators.
+    private static final Pattern AUTH_TO_LOCAL_RULE = Pattern.compile(
+            "\\s*((DEFAULT)|(RULE:\\[(\\d*):([^\\]]*)](\\(([^)]*)\\))?"
+                    + "(s/([^/]*)/([^/]*)/(g)?)?))/?(L)?");
 
     public HadoopKerberosAuthenticator(KerberosAuthenticationConfig config) {
         this.config = config;
     }
 
     public static void initializeAuthConfig(Configuration hadoopConf) {
         
hadoopConf.set(CommonConfigurationKeysPublic.HADOOP_SECURITY_AUTHORIZATION, 
"true");
-        // UserGroupInformation.setConfiguration mutates a single process-wide 
global, so multiple HDFS
-        // catalogs with differing hadoop.security.authentication cannot truly 
coexist. First-writer-wins:
-        // only the first caller publishes the global config; later catalogs 
(and every ticket refresh,
-        // which re-enters this method via login()) skip it so they don't 
stomp on each other. A WARN
-        // fires only on a genuine auth-method mismatch. We compare against a 
remembered method rather than
-        // UserGroupInformation.getLoginUser() on purpose: Doris never 
establishes a process-wide login user
-        // (per-instance getUGIFromSubject only), and getLoginUser() would 
trigger exactly that.
-        UserGroupInformation.AuthenticationMethod desired = 
SecurityUtil.getAuthenticationMethod(hadoopConf);
-        synchronized (HadoopKerberosAuthenticator.class) {
-            if (configuredAuthMethod == null) {
+        String additionalRules = 
hadoopConf.get(CommonConfigurationKeysPublic.HADOOP_SECURITY_AUTH_TO_LOCAL);
+        String mechanism = 
hadoopConf.get(CommonConfigurationKeysPublic.HADOOP_SECURITY_AUTH_TO_LOCAL_MECHANISM,
+                KerberosName.DEFAULT_MECHANISM);
+        // UGI changes its auth mode before parsing rules. Reject malformed 
input before it can leave
+        // an enabled UGI with the permissive rules inherited from a previous 
SIMPLE initialization.
+        
Preconditions.checkArgument(KerberosName.MECHANISM_HADOOP.equalsIgnoreCase(mechanism)
+                        || 
KerberosName.MECHANISM_MIT.equalsIgnoreCase(mechanism),
+                "Invalid auth_to_local mechanism: %s", mechanism);
+        Set<String> requestedRules = additionalRules == null
+                ? Collections.emptySet() : 
parseAuthToLocalRules(additionalRules);
+        // Plugins can load separate copies of this class while sharing 
Hadoop. Lock on the shared
+        // UGI class, and inspect its state instead of keeping a per-plugin 
initialization flag.
+        synchronized (UserGroupInformation.class) {
+            if (!UserGroupInformation.isSecurityEnabled()) {
                 UserGroupInformation.setConfiguration(hadoopConf);

Review Comment:
   Fixed in 6d3e3ed097. Failed full configuration is recorded separately from 
Hadoop's authentication mode, and previous mapping rules/mechanism are 
restored. The next catalog retries full configuration rather than extending the 
failed policy. The helper is now parent-loaded for both connector and 
filesystem plugins, so the failure state is shared with Hadoop. Added the 
SIMPLE -> invalid relogin value -> corrected `new-user` test and a retry 
through a second actual plugin loader; all 76 selected tests passed.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to