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

网格计算

开发平台:

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.Permission;
  20. import java.security.PermissionCollection;
  21. import java.security.Policy;
  22. import java.security.Principal;
  23. import java.security.ProtectionDomain;
  24. import java.util.HashMap;
  25. import java.util.HashSet;
  26. import java.util.Map;
  27. import java.util.Set;
  28. import org.apache.commons.logging.Log;
  29. import org.apache.commons.logging.LogFactory;
  30. import org.apache.hadoop.conf.Configurable;
  31. import org.apache.hadoop.conf.Configuration;
  32. import org.apache.hadoop.security.Group;
  33. import org.apache.hadoop.security.User;
  34. import org.apache.hadoop.security.SecurityUtil.AccessControlList;
  35. /**
  36.  * A {@link Configuration} based security {@link Policy} for Hadoop.
  37.  *
  38.  * {@link ConfiguredPolicy} works in conjunction with a {@link PolicyProvider}
  39.  * for providing service-level authorization for Hadoop.
  40.  */
  41. public class ConfiguredPolicy extends Policy implements Configurable {
  42.   public static final String HADOOP_POLICY_FILE = "hadoop-policy.xml";
  43.   private static final Log LOG = LogFactory.getLog(ConfiguredPolicy.class);
  44.       
  45.   private Configuration conf;
  46.   private PolicyProvider policyProvider;
  47.   private volatile Map<Principal, Set<Permission>> permissions;
  48.   private volatile Set<Permission> allowedPermissions;
  49.   public ConfiguredPolicy(Configuration conf, PolicyProvider policyProvider) {
  50.     this.conf = conf;      
  51.     this.policyProvider = policyProvider;
  52.     refresh();
  53.   }
  54.   @Override
  55.   public Configuration getConf() {
  56.     return conf;
  57.   }
  58.   @Override
  59.   public void setConf(Configuration conf) {
  60.     this.conf = conf;
  61.     refresh();
  62.   }
  63.   @Override
  64.   public boolean implies(ProtectionDomain domain, Permission permission) {
  65.     // Only make checks for domains having principals 
  66.     if(domain.getPrincipals().length == 0) {
  67.       return true; 
  68.     }
  69.     return super.implies(domain, permission);
  70.   }
  71.   @Override
  72.   public PermissionCollection getPermissions(ProtectionDomain domain) {
  73.     PermissionCollection permissionCollection = super.getPermissions(domain);
  74.     for (Principal principal : domain.getPrincipals()) {
  75.       Set<Permission> principalPermissions = permissions.get(principal);
  76.       if (principalPermissions != null) {
  77.         for (Permission permission : principalPermissions) {
  78.           permissionCollection.add(permission);
  79.         }
  80.       }
  81.       for (Permission permission : allowedPermissions) {
  82.         permissionCollection.add(permission);
  83.       }
  84.     }
  85.     return permissionCollection;
  86.   }
  87.   @Override
  88.   public void refresh() {
  89.     // Get the system property 'hadoop.policy.file'
  90.     String policyFile = 
  91.       System.getProperty("hadoop.policy.file", HADOOP_POLICY_FILE);
  92.     
  93.     // Make a copy of the original config, and load the policy file
  94.     Configuration policyConf = new Configuration(conf);
  95.     policyConf.addResource(policyFile);
  96.     
  97.     Map<Principal, Set<Permission>> newPermissions = 
  98.       new HashMap<Principal, Set<Permission>>();
  99.     Set<Permission> newAllowPermissions = new HashSet<Permission>();
  100.     // Parse the config file
  101.     Service[] services = policyProvider.getServices();
  102.     if (services != null) {
  103.       for (Service service : services) {
  104.         AccessControlList acl = 
  105.           new AccessControlList(
  106.               policyConf.get(service.getServiceKey(), 
  107.                              AccessControlList.WILDCARD_ACL_VALUE)
  108.               );
  109.         
  110.         if (acl.allAllowed()) {
  111.           newAllowPermissions.add(service.getPermission());
  112.           if (LOG.isDebugEnabled()) {
  113.             LOG.debug("Policy - " + service.getPermission() + " * ");
  114.           }
  115.         } else {
  116.           for (String user : acl.getUsers()) {
  117.             addPermission(newPermissions, new User(user), service.getPermission());
  118.           }
  119.           for (String group : acl.getGroups()) {
  120.             addPermission(newPermissions, new Group(group), service.getPermission());
  121.           }
  122.         }
  123.       }
  124.     }
  125.     // Flip to the newly parsed permissions
  126.     allowedPermissions = newAllowPermissions;
  127.     permissions = newPermissions;
  128.   }
  129.   private void addPermission(Map<Principal, Set<Permission>> permissions,
  130.                              Principal principal, Permission permission) {
  131.     Set<Permission> principalPermissions = permissions.get(principal);
  132.     if (principalPermissions == null) {
  133.       principalPermissions = new HashSet<Permission>();
  134.       permissions.put(principal, principalPermissions);
  135.     }
  136.     principalPermissions.add(permission);
  137.     if (LOG.isDebugEnabled()) {
  138.       LOG.debug("Policy - Adding  " + permission + " to " + principal);
  139.     }
  140.   }
  141. }