UserGroupInformation.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:4k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.security;
  19. import java.io.IOException;
  20. import java.security.AccessController;
  21. import java.security.Principal;
  22. import java.util.Set;
  23. import javax.security.auth.Subject;
  24. import javax.security.auth.login.LoginException;
  25. import org.apache.commons.logging.Log;
  26. import org.apache.commons.logging.LogFactory;
  27. import org.apache.hadoop.conf.Configuration;
  28. import org.apache.hadoop.io.Writable;
  29. /** A {@link Writable} abstract class for storing user and groups information.
  30.  */
  31. public abstract class UserGroupInformation implements Writable, Principal {
  32.   public static final Log LOG = LogFactory.getLog(UserGroupInformation.class);
  33.   private static UserGroupInformation LOGIN_UGI = null;
  34.   
  35.   private static final ThreadLocal<Subject> currentUser =
  36.     new ThreadLocal<Subject>();
  37.   
  38.   /** @return the {@link UserGroupInformation} for the current thread */ 
  39.   public static UserGroupInformation getCurrentUGI() {
  40.     Subject user = getCurrentUser();
  41.     
  42.     if (user == null) {
  43.       user = currentUser.get();
  44.       if (user == null) {
  45.         return null;
  46.       }
  47.     }
  48.     
  49.     Set<UserGroupInformation> ugiPrincipals = 
  50.       user.getPrincipals(UserGroupInformation.class);
  51.     
  52.     UserGroupInformation ugi = null;
  53.     if (ugiPrincipals != null && ugiPrincipals.size() == 1) {
  54.       ugi = ugiPrincipals.iterator().next();
  55.       if (ugi == null) {
  56.         throw new RuntimeException("Cannot find _current user_ UGI in the Subject!");
  57.       }
  58.     } else {
  59.       throw new RuntimeException("Cannot resolve current user from subject, " +
  60.                               "which had " + ugiPrincipals.size() + 
  61.                               " UGI principals!");
  62.     }
  63.     return ugi;
  64.   }
  65.   /** 
  66.    * Set the {@link UserGroupInformation} for the current thread
  67.    * @deprecated Use {@link #setCurrentUser(UserGroupInformation)} 
  68.    */ 
  69.   @Deprecated
  70.   public static void setCurrentUGI(UserGroupInformation ugi) {
  71.     setCurrentUser(ugi);
  72.   }
  73.   /**
  74.    * Return the current user <code>Subject</code>.
  75.    * @return the current user <code>Subject</code>
  76.    */
  77.   static Subject getCurrentUser() {
  78.     return Subject.getSubject(AccessController.getContext());
  79.   }
  80.   
  81.   /**
  82.    * Set the {@link UserGroupInformation} for the current thread
  83.    * WARNING - This method should be used only in test cases and other exceptional
  84.    * cases!
  85.    * @param ugi {@link UserGroupInformation} for the current thread
  86.    */
  87.   public static void setCurrentUser(UserGroupInformation ugi) {
  88.     Subject user = SecurityUtil.getSubject(ugi);
  89.     currentUser.set(user);
  90.   }
  91.   
  92.   /** Get username
  93.    * 
  94.    * @return the user's name
  95.    */
  96.   public abstract String getUserName();
  97.   
  98.   /** Get the name of the groups that the user belong to
  99.    * 
  100.    * @return an array of group names
  101.    */
  102.   public abstract String[] getGroupNames();
  103.   /** Login and return a UserGroupInformation object. */
  104.   public static UserGroupInformation login(Configuration conf
  105.       ) throws LoginException {
  106.     if (LOGIN_UGI == null) {
  107.       LOGIN_UGI = UnixUserGroupInformation.login(conf);
  108.     }
  109.     return LOGIN_UGI;
  110.   }
  111.   /** Read a {@link UserGroupInformation} from conf */
  112.   public static UserGroupInformation readFrom(Configuration conf
  113.       ) throws IOException {
  114.     try {
  115.       return UnixUserGroupInformation.readFromConf(conf,
  116.         UnixUserGroupInformation.UGI_PROPERTY_NAME);
  117.     } catch (LoginException e) {
  118.       throw (IOException)new IOException().initCause(e);
  119.     }
  120.   }
  121. }