You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by th...@apache.org on 2014/02/14 01:26:11 UTC

svn commit: r1568175 - in /hive/trunk: metastore/src/java/org/apache/hadoop/hive/metastore/ ql/src/java/org/apache/hadoop/hive/ql/security/ ql/src/java/org/apache/hadoop/hive/ql/security/authorization/

Author: thejas
Date: Fri Feb 14 00:26:11 2014
New Revision: 1568175

URL: http://svn.apache.org/r1568175
Log:
HIVE-5989 : Hive metastore authorization check is not threadsafe (Sushanth Sowmyan via Thejas Nair)

Modified:
    hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/security/HadoopDefaultMetastoreAuthenticator.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/AuthorizationPreEventListener.java

Modified: hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java
URL: http://svn.apache.org/viewvc/hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java?rev=1568175&r1=1568174&r2=1568175&view=diff
==============================================================================
--- hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java (original)
+++ hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java Fri Feb 14 00:26:11 2014
@@ -409,7 +409,7 @@ public class HiveMetaStore extends Thrif
       }
     }
 
-    private Configuration getConf() {
+    public Configuration getConf() {
       Configuration conf = threadLocalConf.get();
       if (conf == null) {
         conf = new Configuration(hiveConf);

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/security/HadoopDefaultMetastoreAuthenticator.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/security/HadoopDefaultMetastoreAuthenticator.java?rev=1568175&r1=1568174&r2=1568175&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/security/HadoopDefaultMetastoreAuthenticator.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/security/HadoopDefaultMetastoreAuthenticator.java Fri Feb 14 00:26:11 2014
@@ -25,7 +25,7 @@ public class HadoopDefaultMetastoreAuthe
 
   @Override
   public void setMetaStoreHandler(HMSHandler handler) {
-    setConf(handler.getHiveConf());
+    setConf(handler.getConf());
   }
 
 }

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/AuthorizationPreEventListener.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/AuthorizationPreEventListener.java?rev=1568175&r1=1568174&r2=1568175&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/AuthorizationPreEventListener.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/AuthorizationPreEventListener.java Fri Feb 14 00:26:11 2014
@@ -59,25 +59,68 @@ public class AuthorizationPreEventListen
   public static final Log LOG = LogFactory.getLog(
       AuthorizationPreEventListener.class);
 
-  private static HiveConf conf;
-  private static HiveMetastoreAuthorizationProvider authorizer;
-  private static HiveMetastoreAuthenticationProvider authenticator;
+  private final ThreadLocal<Configuration> tConfig = new ThreadLocal<Configuration>() {
+    @Override
+    protected Configuration initialValue() {
+      return new HiveConf(AuthorizationPreEventListener.class);
+    }
+  };
+
+  private final ThreadLocal<HiveMetastoreAuthenticationProvider> tAuthenticator
+      = new ThreadLocal<HiveMetastoreAuthenticationProvider>() {
+    @Override
+    protected HiveMetastoreAuthenticationProvider initialValue() {
+      try {
+        return  (HiveMetastoreAuthenticationProvider) HiveUtils.getAuthenticator(
+            tConfig.get(), HiveConf.ConfVars.HIVE_METASTORE_AUTHENTICATOR_MANAGER);
+      } catch (HiveException he) {
+        throw new IllegalStateException("Authentication provider instantiation failure",he);
+      }
+    }
+  };
+
+  private final ThreadLocal<HiveMetastoreAuthorizationProvider> tAuthorizer
+      = new ThreadLocal<HiveMetastoreAuthorizationProvider>() {
+    @Override
+    protected HiveMetastoreAuthorizationProvider initialValue() {
+      try {
+        return  (HiveMetastoreAuthorizationProvider) HiveUtils.getAuthorizeProviderManager(
+            tConfig.get(), HiveConf.ConfVars.HIVE_METASTORE_AUTHORIZATION_MANAGER, tAuthenticator.get());
+      } catch (HiveException he) {
+        throw new IllegalStateException("Authorization provider instantiation failure",he);
+      }
+    }
+  };
+
+  private final ThreadLocal<Boolean> tConfigSetOnAuths = new ThreadLocal<Boolean>() {
+    @Override
+    protected Boolean initialValue() {
+      return false;
+    }
+  };
 
   public AuthorizationPreEventListener(Configuration config) throws HiveException {
     super(config);
-
-    authenticator = (HiveMetastoreAuthenticationProvider) HiveUtils.getAuthenticator(
-        config, HiveConf.ConfVars.HIVE_METASTORE_AUTHENTICATOR_MANAGER);
-    authorizer = (HiveMetastoreAuthorizationProvider) HiveUtils.getAuthorizeProviderManager(
-        config, HiveConf.ConfVars.HIVE_METASTORE_AUTHORIZATION_MANAGER, authenticator);
   }
 
   @Override
   public void onEvent(PreEventContext context) throws MetaException, NoSuchObjectException,
       InvalidOperationException {
 
-    authenticator.setMetaStoreHandler(context.getHandler());
-    authorizer.setMetaStoreHandler(context.getHandler());
+    if (!tConfigSetOnAuths.get()){
+      // The reason we do this guard is because when we do not have a good way of initializing
+      // the config to the handler's thread local config until this call, so we do it then.
+      // Once done, though, we need not repeat this linking, we simply call setMetaStoreHandler
+      // and let the AuthorizationProvider and AuthenticationProvider do what they want.
+      tConfig.set(context.getHandler().getConf());
+      // Warning note : HMSHandler.getHiveConf() is not thread-unique, .getConf() is.
+      tAuthenticator.get().setConf(tConfig.get());
+      tAuthorizer.get().setConf(tConfig.get());
+      tConfigSetOnAuths.set(true); // set so we don't repeat this initialization
+    }
+
+    tAuthenticator.get().setMetaStoreHandler(context.getHandler());
+    tAuthorizer.get().setMetaStoreHandler(context.getHandler());
 
     switch (context.getEventType()) {
     case CREATE_TABLE:
@@ -116,7 +159,7 @@ public class AuthorizationPreEventListen
   private void authorizeCreateDatabase(PreCreateDatabaseEvent context)
       throws InvalidOperationException, MetaException {
     try {
-      authorizer.authorize(new Database(context.getDatabase()),
+      tAuthorizer.get().authorize(new Database(context.getDatabase()),
           HiveOperation.CREATEDATABASE.getInputRequiredPrivileges(),
           HiveOperation.CREATEDATABASE.getOutputRequiredPrivileges());
     } catch (AuthorizationException e) {
@@ -129,7 +172,7 @@ public class AuthorizationPreEventListen
   private void authorizeDropDatabase(PreDropDatabaseEvent context)
       throws InvalidOperationException, MetaException {
     try {
-      authorizer.authorize(new Database(context.getDatabase()),
+      tAuthorizer.get().authorize(new Database(context.getDatabase()),
           HiveOperation.DROPDATABASE.getInputRequiredPrivileges(),
           HiveOperation.DROPDATABASE.getOutputRequiredPrivileges());
     } catch (AuthorizationException e) {
@@ -142,7 +185,7 @@ public class AuthorizationPreEventListen
   private void authorizeCreateTable(PreCreateTableEvent context)
       throws InvalidOperationException, MetaException {
     try {
-      authorizer.authorize(getTableFromApiTable(context.getTable()),
+      tAuthorizer.get().authorize(getTableFromApiTable(context.getTable()),
           HiveOperation.CREATETABLE.getInputRequiredPrivileges(),
           HiveOperation.CREATETABLE.getOutputRequiredPrivileges());
     } catch (AuthorizationException e) {
@@ -155,7 +198,7 @@ public class AuthorizationPreEventListen
   private void authorizeDropTable(PreDropTableEvent context)
       throws InvalidOperationException, MetaException {
     try {
-      authorizer.authorize(getTableFromApiTable(context.getTable()),
+      tAuthorizer.get().authorize(getTableFromApiTable(context.getTable()),
           HiveOperation.DROPTABLE.getInputRequiredPrivileges(),
           HiveOperation.DROPTABLE.getOutputRequiredPrivileges());
     } catch (AuthorizationException e) {
@@ -168,7 +211,7 @@ public class AuthorizationPreEventListen
   private void authorizeAlterTable(PreAlterTableEvent context)
       throws InvalidOperationException, MetaException {
     try {
-      authorizer.authorize(getTableFromApiTable(context.getOldTable()),
+      tAuthorizer.get().authorize(getTableFromApiTable(context.getOldTable()),
           null,
           new Privilege[]{Privilege.ALTER_METADATA});
     } catch (AuthorizationException e) {
@@ -182,7 +225,7 @@ public class AuthorizationPreEventListen
       throws InvalidOperationException, MetaException {
     try {
       org.apache.hadoop.hive.metastore.api.Partition mapiPart = context.getPartition();
-      authorizer.authorize(getPartitionFromApiPartition(mapiPart, context),
+      tAuthorizer.get().authorize(getPartitionFromApiPartition(mapiPart, context),
           HiveOperation.ALTERTABLE_ADDPARTS.getInputRequiredPrivileges(),
           HiveOperation.ALTERTABLE_ADDPARTS.getOutputRequiredPrivileges());
     } catch (AuthorizationException e) {
@@ -198,7 +241,7 @@ public class AuthorizationPreEventListen
       throws InvalidOperationException, MetaException {
     try {
       org.apache.hadoop.hive.metastore.api.Partition mapiPart = context.getPartition();
-      authorizer.authorize(getPartitionFromApiPartition(mapiPart, context),
+      tAuthorizer.get().authorize(getPartitionFromApiPartition(mapiPart, context),
           HiveOperation.ALTERTABLE_DROPPARTS.getInputRequiredPrivileges(),
           HiveOperation.ALTERTABLE_DROPPARTS.getOutputRequiredPrivileges());
     } catch (AuthorizationException e) {
@@ -214,7 +257,7 @@ public class AuthorizationPreEventListen
       throws InvalidOperationException, MetaException {
     try {
       org.apache.hadoop.hive.metastore.api.Partition mapiPart = context.getNewPartition();
-      authorizer.authorize(getPartitionFromApiPartition(mapiPart, context),
+      tAuthorizer.get().authorize(getPartitionFromApiPartition(mapiPart, context),
           null,
           new Privilege[]{Privilege.ALTER_METADATA});
     } catch (AuthorizationException e) {