ServiceAuthorizationManager.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.authorize;
  19. import java.security.AccessControlException;
  20. import java.security.AccessController;
  21. import java.security.Permission;
  22. import java.security.PrivilegedActionException;
  23. import java.security.PrivilegedExceptionAction;
  24. import java.util.Collections;
  25. import java.util.HashMap;
  26. import java.util.Map;
  27. import javax.security.auth.Subject;
  28. import org.apache.commons.logging.Log;
  29. import org.apache.commons.logging.LogFactory;
  30. import org.apache.hadoop.security.UserGroupInformation;
  31. /**
  32.  * An authorization manager which handles service-level authorization
  33.  * for incoming service requests.
  34.  */
  35. public class ServiceAuthorizationManager {
  36.   private static final Log LOG = 
  37.     LogFactory.getLog(ServiceAuthorizationManager.class);
  38.   
  39.   /**
  40.    * Configuration key for controlling service-level authorization for Hadoop.
  41.    */
  42.   public static final String SERVICE_AUTHORIZATION_CONFIG = 
  43.     "hadoop.security.authorization";
  44.   
  45.   private static Map<Class<?>, Permission> protocolToPermissionMap = 
  46.     Collections.synchronizedMap(new HashMap<Class<?>, Permission>());
  47.   /**
  48.    * Authorize the user to access the protocol being used.
  49.    * 
  50.    * @param user user accessing the service 
  51.    * @param protocol service being accessed
  52.    * @throws AuthorizationException on authorization failure
  53.    */
  54.   public static void authorize(Subject user, Class<?> protocol) 
  55.   throws AuthorizationException {
  56.     Permission permission = protocolToPermissionMap.get(protocol);
  57.     if (permission == null) {
  58.       permission = new ConnectionPermission(protocol);
  59.       protocolToPermissionMap.put(protocol, permission);
  60.     }
  61.     
  62.     checkPermission(user, permission);
  63.   }
  64.   
  65.   /**
  66.    * Check if the given {@link Subject} has all of necessary {@link Permission} 
  67.    * set.
  68.    * 
  69.    * @param user <code>Subject</code> to be authorized
  70.    * @param permissions <code>Permission</code> set
  71.    * @throws AuthorizationException if the authorization failed
  72.    */
  73.   private static void checkPermission(final Subject user, 
  74.                                       final Permission... permissions) 
  75.   throws AuthorizationException {
  76.     try{
  77.       Subject.doAs(user, 
  78.                    new PrivilegedExceptionAction<Void>() {
  79.                      @Override
  80.                      public Void run() throws Exception {
  81.                        try {
  82.                          for(Permission permission : permissions) {
  83.                            AccessController.checkPermission(permission);
  84.                          }
  85.                        } catch (AccessControlException ace) {
  86.                          LOG.info("Authorization failed for " + 
  87.                                   UserGroupInformation.getCurrentUGI(), ace);
  88.                          throw new AuthorizationException(ace);
  89.                        }
  90.                       return null;
  91.                      }
  92.                    }
  93.                   );
  94.     } catch (PrivilegedActionException e) {
  95.       throw new AuthorizationException(e.getException());
  96.     }
  97.   }
  98.   
  99. }