KYLIN-2760 Enhance ACL Logic

Project: http://git-wip-us.apache.org/repos/asf/kylin/repo
Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/7a9f74c8
Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/7a9f74c8
Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/7a9f74c8

Branch: refs/heads/master
Commit: 7a9f74c8a0f70480f40c6e88e0aeb71824fd7884
Parents: fa7eb69
Author: tttMelody <245915...@qq.com>
Authored: Wed Aug 16 14:35:08 2017 +0800
Committer: Hongbin Ma <m...@kyligence.io>
Committed: Wed Aug 16 16:04:09 2017 +0800

----------------------------------------------------------------------
 .../org/apache/kylin/cube/CubeInstance.java     |   6 +
 .../java/org/apache/kylin/job/JobInstance.java  |   2 +-
 .../kylin/metadata/model/DataModelDesc.java     |   7 +-
 .../apache/kylin/rest/constant/Constant.java    |  11 +-
 .../rest/controller/ProjectController.java      |  25 +---
 .../rest/controller/StreamingController.java    |  37 +++---
 .../rest/controller2/CubeDescControllerV2.java  |  10 +-
 .../rest/controller2/ModelControllerV2.java     |  23 ++--
 .../rest/controller2/ModelDescControllerV2.java |  18 +--
 .../rest/controller2/StreamingControllerV2.java |  33 ++---
 .../rest/controller2/TableControllerV2.java     |   2 +-
 .../kylin/rest/service/AccessService.java       |   5 +
 .../apache/kylin/rest/service/CubeService.java  |  83 ++++--------
 .../kylin/rest/service/DiagnosisService.java    |  18 ++-
 .../kylin/rest/service/HybridService.java       |  16 ++-
 .../apache/kylin/rest/service/JobService.java   |  35 ++---
 .../kylin/rest/service/KafkaConfigService.java  |  25 ++--
 .../apache/kylin/rest/service/ModelService.java |  71 ++++++----
 .../kylin/rest/service/ProjectService.java      |  29 +---
 .../apache/kylin/rest/service/QueryService.java |  10 +-
 .../kylin/rest/service/StreamingService.java    |  22 ++--
 .../apache/kylin/rest/service/TableService.java |  27 ++--
 .../org/apache/kylin/rest/util/AclEvaluate.java | 131 +++++++++++++++++++
 .../org/apache/kylin/rest/util/AclUtil.java     |  39 ++++--
 .../org/apache/kylin/rest/bean/BeanTest.java    |   7 +-
 .../rest/controller/AccessControllerTest.java   |  25 +++-
 26 files changed, 440 insertions(+), 277 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kylin/blob/7a9f74c8/core-cube/src/main/java/org/apache/kylin/cube/CubeInstance.java
----------------------------------------------------------------------
diff --git a/core-cube/src/main/java/org/apache/kylin/cube/CubeInstance.java 
b/core-cube/src/main/java/org/apache/kylin/cube/CubeInstance.java
index 4d205eb..4c57db8 100644
--- a/core-cube/src/main/java/org/apache/kylin/cube/CubeInstance.java
+++ b/core-cube/src/main/java/org/apache/kylin/cube/CubeInstance.java
@@ -36,6 +36,8 @@ import org.apache.kylin.metadata.model.MeasureDesc;
 import org.apache.kylin.metadata.model.SegmentStatusEnum;
 import org.apache.kylin.metadata.model.Segments;
 import org.apache.kylin.metadata.model.TblColRef;
+import org.apache.kylin.metadata.project.ProjectInstance;
+import org.apache.kylin.metadata.project.ProjectManager;
 import org.apache.kylin.metadata.realization.CapabilityResult;
 import 
org.apache.kylin.metadata.realization.CapabilityResult.CapabilityInfluence;
 import org.apache.kylin.metadata.realization.IRealization;
@@ -385,6 +387,10 @@ public class CubeInstance extends RootPersistentEntity 
implements IRealization,
         return getDescriptor().getProject();
     }
 
+    public ProjectInstance getProjectInstance() {
+        return 
ProjectManager.getInstance(getConfig()).getProject(getProject());
+    }
+
     @Override
     public int getSourceType() {
         return getModel().getRootFactTable().getTableDesc().getSourceType();

http://git-wip-us.apache.org/repos/asf/kylin/blob/7a9f74c8/core-job/src/main/java/org/apache/kylin/job/JobInstance.java
----------------------------------------------------------------------
diff --git a/core-job/src/main/java/org/apache/kylin/job/JobInstance.java 
b/core-job/src/main/java/org/apache/kylin/job/JobInstance.java
index 3778834..bbbbb94 100644
--- a/core-job/src/main/java/org/apache/kylin/job/JobInstance.java
+++ b/core-job/src/main/java/org/apache/kylin/job/JobInstance.java
@@ -167,7 +167,7 @@ public class JobInstance extends RootPersistentEntity 
implements Comparable<JobI
         this.duration = duration;
     }
 
-    public String getRelatedCube() {
+    public String getRelatedCube() { // if model check, return model name.
         return relatedCube;
     }
 

http://git-wip-us.apache.org/repos/asf/kylin/blob/7a9f74c8/core-metadata/src/main/java/org/apache/kylin/metadata/model/DataModelDesc.java
----------------------------------------------------------------------
diff --git 
a/core-metadata/src/main/java/org/apache/kylin/metadata/model/DataModelDesc.java
 
b/core-metadata/src/main/java/org/apache/kylin/metadata/model/DataModelDesc.java
index f82c996..2037420 100644
--- 
a/core-metadata/src/main/java/org/apache/kylin/metadata/model/DataModelDesc.java
+++ 
b/core-metadata/src/main/java/org/apache/kylin/metadata/model/DataModelDesc.java
@@ -40,6 +40,7 @@ import org.apache.kylin.common.util.Pair;
 import org.apache.kylin.common.util.StringUtil;
 import org.apache.kylin.metadata.MetadataConstants;
 import org.apache.kylin.metadata.model.JoinsTree.Chain;
+import org.apache.kylin.metadata.project.ProjectInstance;
 import org.apache.kylin.metadata.project.ProjectManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -827,7 +828,11 @@ public class DataModelDesc extends RootPersistentEntity {
     }
 
     public String getProject() {
-        return 
ProjectManager.getInstance(getConfig()).getProjectOfModel(this.getName()).getName();
+        return 
ProjectManager.getInstance(KylinConfig.getInstanceFromEnv()).getProjectOfModel(this.getName()).getName();
+    }
+
+    public ProjectInstance getProjectInstance() {
+        return 
ProjectManager.getInstance(KylinConfig.getInstanceFromEnv()).getProjectOfModel(this.getName());
     }
 
     public static DataModelDesc getCopyOf(DataModelDesc orig) {

http://git-wip-us.apache.org/repos/asf/kylin/blob/7a9f74c8/server-base/src/main/java/org/apache/kylin/rest/constant/Constant.java
----------------------------------------------------------------------
diff --git 
a/server-base/src/main/java/org/apache/kylin/rest/constant/Constant.java 
b/server-base/src/main/java/org/apache/kylin/rest/constant/Constant.java
index 5d326e9..697a660 100644
--- a/server-base/src/main/java/org/apache/kylin/rest/constant/Constant.java
+++ b/server-base/src/main/java/org/apache/kylin/rest/constant/Constant.java
@@ -35,9 +35,14 @@ public class Constant {
     public final static String ROLE_ANALYST = "ROLE_ANALYST";
 
     public final static String ACCESS_HAS_ROLE_ADMIN = "hasRole('ROLE_ADMIN')";
-//    public final static String ACCESS_HAS_ROLE_MODELER = 
"hasRole('ROLE_MODELER')";
-
-    public final static String ACCESS_POST_FILTER_READ = 
"hasRole('ROLE_ADMIN') or hasPermission(filterObject, 'READ') or 
hasPermission(filterObject, 'MANAGEMENT') " + "or hasPermission(filterObject, 
'OPERATION') or hasPermission(filterObject, 'ADMINISTRATION')";
+    //public final static String ACCESS_HAS_ROLE_MODELER = 
"hasRole('ROLE_MODELER')";
+
+    public final static String ACCESS_POST_FILTER_READ =
+            "hasRole('ROLE_ADMIN') " +
+            " or hasPermission(filterObject, 'ADMINISTRATION')"+
+            " or hasPermission(filterObject, 'MANAGEMENT')" +
+            " or hasPermission(filterObject, 'OPERATION')" +
+            " or hasPermission(filterObject, 'READ')";
 
     public final static String SERVER_MODE_QUERY = "query";
     public final static String SERVER_MODE_JOB = "job";

http://git-wip-us.apache.org/repos/asf/kylin/blob/7a9f74c8/server-base/src/main/java/org/apache/kylin/rest/controller/ProjectController.java
----------------------------------------------------------------------
diff --git 
a/server-base/src/main/java/org/apache/kylin/rest/controller/ProjectController.java
 
b/server-base/src/main/java/org/apache/kylin/rest/controller/ProjectController.java
index 74e806e..4bb8e82 100644
--- 
a/server-base/src/main/java/org/apache/kylin/rest/controller/ProjectController.java
+++ 
b/server-base/src/main/java/org/apache/kylin/rest/controller/ProjectController.java
@@ -24,7 +24,6 @@ import java.util.List;
 
 import org.apache.commons.lang.StringUtils;
 import org.apache.kylin.common.util.JsonUtil;
-import org.apache.kylin.cube.CubeInstance;
 import org.apache.kylin.metadata.project.ProjectInstance;
 import org.apache.kylin.rest.exception.BadRequestException;
 import org.apache.kylin.rest.exception.InternalErrorException;
@@ -32,7 +31,7 @@ import org.apache.kylin.rest.request.ProjectRequest;
 import org.apache.kylin.rest.service.AccessService;
 import org.apache.kylin.rest.service.CubeService;
 import org.apache.kylin.rest.service.ProjectService;
-import org.apache.kylin.rest.util.AclUtil;
+import org.apache.kylin.rest.util.AclEvaluate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -68,7 +67,7 @@ public class ProjectController extends BasicController {
     @Qualifier("cubeMgmtService")
     private CubeService cubeService;
     @Autowired
-    private AclUtil aclUtil;
+    private AclEvaluate aclEvaluate;
 
     /**
      * Get available project list
@@ -99,29 +98,11 @@ public class ProjectController extends BasicController {
 
             boolean hasProjectPermission = false;
             try {
-                hasProjectPermission = 
aclUtil.hasProjectReadPermission(projectInstance);
+                hasProjectPermission = 
aclEvaluate.hasProjectReadPermission(projectInstance);
             } catch (AccessDeniedException e) {
                 //ignore to continue
             }
 
-            if (!hasProjectPermission) {
-                List<CubeInstance> cubeInstances = 
cubeService.listAllCubes(projectInstance.getName());
-
-                for (CubeInstance cubeInstance : cubeInstances) {
-                    if (cubeInstance == null) {
-                        continue;
-                    }
-
-                    try {
-                        aclUtil.hasCubeReadPermission(cubeInstance);
-                        hasProjectPermission = true;
-                        break;
-                    } catch (AccessDeniedException e) {
-                        //ignore to continue
-                    }
-                }
-            }
-            
             if (hasProjectPermission) {
                 readableProjects.add(projectInstance);
             }

http://git-wip-us.apache.org/repos/asf/kylin/blob/7a9f74c8/server-base/src/main/java/org/apache/kylin/rest/controller/StreamingController.java
----------------------------------------------------------------------
diff --git 
a/server-base/src/main/java/org/apache/kylin/rest/controller/StreamingController.java
 
b/server-base/src/main/java/org/apache/kylin/rest/controller/StreamingController.java
index b0bb02a..593abea 100644
--- 
a/server-base/src/main/java/org/apache/kylin/rest/controller/StreamingController.java
+++ 
b/server-base/src/main/java/org/apache/kylin/rest/controller/StreamingController.java
@@ -77,10 +77,11 @@ public class StreamingController extends BasicController {
 
     @RequestMapping(value = "/getConfig", method = { RequestMethod.GET }, 
produces = { "application/json" })
     @ResponseBody
-    public List<StreamingConfig> getStreamings(@RequestParam(value = "table", 
required = false) String table, @RequestParam(value = "limit", required = 
false) Integer limit, @RequestParam(value = "offset", required = false) Integer 
offset) {
+    public List<StreamingConfig> getStreamings(@RequestParam(value = "table", 
required = false) String table, @RequestParam(value = "project", required = 
false) String project, @RequestParam(value = "limit", required = false) Integer 
limit, @RequestParam(value = "offset", required = false) Integer offset) {
         try {
-            return streamingService.getStreamingConfigs(table, limit, offset);
+            return streamingService.getStreamingConfigs(table, project, limit, 
offset);
         } catch (IOException e) {
+
             logger.error("Failed to deal with the request:" + 
e.getLocalizedMessage(), e);
             throw new InternalErrorException("Failed to deal with the request: 
" + e.getLocalizedMessage());
         }
@@ -88,9 +89,9 @@ public class StreamingController extends BasicController {
 
     @RequestMapping(value = "/getKfkConfig", method = { RequestMethod.GET }, 
produces = { "application/json" })
     @ResponseBody
-    public List<KafkaConfig> getKafkaConfigs(@RequestParam(value = 
"kafkaConfigName", required = false) String kafkaConfigName, 
@RequestParam(value = "limit", required = false) Integer limit, 
@RequestParam(value = "offset", required = false) Integer offset) {
+    public List<KafkaConfig> getKafkaConfigs(@RequestParam(value = 
"kafkaConfigName", required = false) String kafkaConfigName, 
@RequestParam(value = "project", required = false) String project, 
@RequestParam(value = "limit", required = false) Integer limit, 
@RequestParam(value = "offset", required = false) Integer offset) {
         try {
-            return kafkaConfigService.getKafkaConfigs(kafkaConfigName, limit, 
offset);
+            return kafkaConfigService.getKafkaConfigs(kafkaConfigName, 
project, limit, offset);
         } catch (IOException e) {
             logger.error("Failed to deal with the request:" + 
e.getLocalizedMessage(), e);
             throw new InternalErrorException("Failed to deal with the request: 
" + e.getLocalizedMessage());
@@ -131,7 +132,7 @@ public class StreamingController extends BasicController {
             }
             try {
                 streamingConfig.setUuid(UUID.randomUUID().toString());
-                streamingService.createStreamingConfig(streamingConfig);
+                streamingService.createStreamingConfig(streamingConfig, 
project);
                 saveStreamingSuccess = true;
             } catch (IOException e) {
                 logger.error("Failed to save StreamingConfig:" + 
e.getLocalizedMessage(), e);
@@ -139,11 +140,11 @@ public class StreamingController extends BasicController {
             }
             try {
                 kafkaConfig.setUuid(UUID.randomUUID().toString());
-                kafkaConfigService.createKafkaConfig(kafkaConfig);
+                kafkaConfigService.createKafkaConfig(kafkaConfig, project);
                 saveKafkaSuccess = true;
             } catch (IOException e) {
                 try {
-                    streamingService.dropStreamingConfig(streamingConfig);
+                    streamingService.dropStreamingConfig(streamingConfig, 
project);
                 } catch (IOException e1) {
                     throw new InternalErrorException("StreamingConfig is 
created, but failed to create KafkaConfig: " + e.getLocalizedMessage());
                 }
@@ -156,15 +157,15 @@ public class StreamingController extends BasicController {
                 if (saveStreamingSuccess == true) {
                     StreamingConfig sConfig = 
streamingService.getStreamingManager().getStreamingConfig(streamingConfig.getName());
                     try {
-                        streamingService.dropStreamingConfig(sConfig);
+                        streamingService.dropStreamingConfig(sConfig, project);
                     } catch (IOException e) {
                         throw new InternalErrorException("Action failed and 
failed to rollback the created streaming config: " + e.getLocalizedMessage());
                     }
                 }
                 if (saveKafkaSuccess == true) {
                     try {
-                        KafkaConfig kConfig = 
kafkaConfigService.getKafkaConfig(kafkaConfig.getName());
-                        kafkaConfigService.dropKafkaConfig(kConfig);
+                        KafkaConfig kConfig = 
kafkaConfigService.getKafkaConfig(kafkaConfig.getName(), project);
+                        kafkaConfigService.dropKafkaConfig(kConfig, project);
                     } catch (IOException e) {
                         throw new InternalErrorException("Action failed and 
failed to rollback the created kafka config: " + e.getLocalizedMessage());
                     }
@@ -181,12 +182,12 @@ public class StreamingController extends BasicController {
     public StreamingRequest updateStreamingConfig(@RequestBody 
StreamingRequest streamingRequest) throws JsonProcessingException {
         StreamingConfig streamingConfig = 
deserializeSchemalDesc(streamingRequest);
         KafkaConfig kafkaConfig = 
deserializeKafkaSchemalDesc(streamingRequest);
-
+        String project = streamingRequest.getProject();
         if (streamingConfig == null) {
             return streamingRequest;
         }
         try {
-            streamingConfig = 
streamingService.updateStreamingConfig(streamingConfig);
+            streamingConfig = 
streamingService.updateStreamingConfig(streamingConfig, project);
         } catch (AccessDeniedException accessDeniedException) {
             throw new ForbiddenException("You don't have right to update this 
StreamingConfig.");
         } catch (Exception e) {
@@ -194,7 +195,7 @@ public class StreamingController extends BasicController {
             throw new InternalErrorException("Failed to deal with the request: 
" + e.getLocalizedMessage());
         }
         try {
-            kafkaConfig = kafkaConfigService.updateKafkaConfig(kafkaConfig);
+            kafkaConfig = kafkaConfigService.updateKafkaConfig(kafkaConfig, 
project);
         } catch (AccessDeniedException accessDeniedException) {
             throw new ForbiddenException("You don't have right to update this 
KafkaConfig.");
         } catch (Exception e) {
@@ -207,17 +208,17 @@ public class StreamingController extends BasicController {
         return streamingRequest;
     }
 
-    @RequestMapping(value = "/{configName}", method = { RequestMethod.DELETE 
}, produces = { "application/json" })
+    @RequestMapping(value = "/{project}/{configName}", method = { 
RequestMethod.DELETE }, produces = { "application/json" })
     @ResponseBody
-    public void deleteConfig(@PathVariable String configName) throws 
IOException {
+    public void deleteConfig(@PathVariable String project, @PathVariable 
String configName) throws IOException {
         StreamingConfig config = 
streamingService.getStreamingManager().getStreamingConfig(configName);
-        KafkaConfig kafkaConfig = 
kafkaConfigService.getKafkaConfig(configName);
+        KafkaConfig kafkaConfig = 
kafkaConfigService.getKafkaConfig(configName, project);
         if (null == config) {
             throw new NotFoundException("StreamingConfig with name " + 
configName + " not found..");
         }
         try {
-            streamingService.dropStreamingConfig(config);
-            kafkaConfigService.dropKafkaConfig(kafkaConfig);
+            streamingService.dropStreamingConfig(config, project);
+            kafkaConfigService.dropKafkaConfig(kafkaConfig, project);
         } catch (Exception e) {
             logger.error(e.getLocalizedMessage(), e);
             throw new InternalErrorException("Failed to delete 
StreamingConfig. " + " Caused by: " + e.getMessage(), e);

http://git-wip-us.apache.org/repos/asf/kylin/blob/7a9f74c8/server-base/src/main/java/org/apache/kylin/rest/controller2/CubeDescControllerV2.java
----------------------------------------------------------------------
diff --git 
a/server-base/src/main/java/org/apache/kylin/rest/controller2/CubeDescControllerV2.java
 
b/server-base/src/main/java/org/apache/kylin/rest/controller2/CubeDescControllerV2.java
index 3382445..5e2eb34 100644
--- 
a/server-base/src/main/java/org/apache/kylin/rest/controller2/CubeDescControllerV2.java
+++ 
b/server-base/src/main/java/org/apache/kylin/rest/controller2/CubeDescControllerV2.java
@@ -51,15 +51,15 @@ public class CubeDescControllerV2 extends BasicController {
     @Qualifier("cubeMgmtService")
     private CubeService cubeService;
 
-    @RequestMapping(value = "/{cubeName}", method = { RequestMethod.GET }, 
produces = {
-            "application/vnd.apache.kylin-v2+json" })
+    @RequestMapping(value = "/{projectName}/{cubeName}", method = 
{RequestMethod.GET}, produces = {
+            "application/vnd.apache.kylin-v2+json"})
     @ResponseBody
-    public EnvelopeResponse getDescV2(@PathVariable String cubeName) throws 
IOException {
+    public EnvelopeResponse getDescV2(@PathVariable String projectName, 
@PathVariable String cubeName) throws IOException {
         Message msg = MsgPicker.getMsg();
 
         CubeInstance cube = cubeService.getCubeManager().getCube(cubeName);
-        Draft draft = cubeService.getCubeDraft(cubeName);
-        
+        Draft draft = cubeService.getCubeDraft(cubeName, projectName);
+
         if (cube == null && draft == null) {
             throw new 
BadRequestException(String.format(msg.getCUBE_NOT_FOUND(), cubeName));
         }

http://git-wip-us.apache.org/repos/asf/kylin/blob/7a9f74c8/server-base/src/main/java/org/apache/kylin/rest/controller2/ModelControllerV2.java
----------------------------------------------------------------------
diff --git 
a/server-base/src/main/java/org/apache/kylin/rest/controller2/ModelControllerV2.java
 
b/server-base/src/main/java/org/apache/kylin/rest/controller2/ModelControllerV2.java
index 58f6bee..f7cb844 100644
--- 
a/server-base/src/main/java/org/apache/kylin/rest/controller2/ModelControllerV2.java
+++ 
b/server-base/src/main/java/org/apache/kylin/rest/controller2/ModelControllerV2.java
@@ -201,21 +201,20 @@ public class ModelControllerV2 extends BasicController {
         return new EnvelopeResponse(ResponseCode.CODE_SUCCESS, data, "");
     }
 
-    @RequestMapping(value = "/{modelName}", method = { RequestMethod.DELETE }, 
produces = {
-            "application/vnd.apache.kylin-v2+json" })
+    @RequestMapping(value = "/{projectName}/{modelName}", method = 
{RequestMethod.DELETE}, produces = {
+            "application/vnd.apache.kylin-v2+json"})
     @ResponseBody
-    public void deleteModelV2(@PathVariable String modelName) throws 
IOException {
+    public void deleteModelV2(@PathVariable String projectName, @PathVariable 
String modelName) throws IOException {
         Message msg = MsgPicker.getMsg();
 
-        DataModelDesc model = 
modelService.getMetadataManager().getDataModelDesc(modelName);
-        Draft draft = modelService.getModelDraft(modelName);
-        
+        DataModelDesc model = modelService.getModel(modelName, projectName);
+        Draft draft = modelService.getModelDraft(modelName, projectName);
         if (null == model && null == draft)
             throw new 
BadRequestException(String.format(msg.getMODEL_NOT_FOUND(), modelName));
-        
+
         if (model != null)
             modelService.dropModel(model);
-        
+
         if (draft != null)
             modelService.getDraftManager().delete(draft.getUuid());
     }
@@ -283,18 +282,18 @@ public class ModelControllerV2 extends BasicController {
         return desc;
     }
 
-    @RequestMapping(value = "/{modelName}/usedCols", method = 
RequestMethod.GET, produces = {
+    @RequestMapping(value = "/{modelName}/{projectName}/usedCols", method = 
RequestMethod.GET, produces = {
             "application/vnd.apache.kylin-v2+json" })
     @ResponseBody
-    public EnvelopeResponse getUsedColsV2(@PathVariable String modelName) {
+    public EnvelopeResponse getUsedColsV2(@PathVariable String projectName, 
@PathVariable String modelName) {
 
         Map<String, Set<String>> data = new HashMap<>();
 
-        for (Map.Entry<TblColRef, Set<CubeInstance>> entry : 
modelService.getUsedDimCols(modelName).entrySet()) {
+        for (Map.Entry<TblColRef, Set<CubeInstance>> entry : 
modelService.getUsedDimCols(modelName, projectName).entrySet()) {
             populateUsedColResponse(entry.getKey(), entry.getValue(), data);
         }
 
-        for (Map.Entry<TblColRef, Set<CubeInstance>> entry : 
modelService.getUsedNonDimCols(modelName).entrySet()) {
+        for (Map.Entry<TblColRef, Set<CubeInstance>> entry : 
modelService.getUsedNonDimCols(modelName, projectName).entrySet()) {
             populateUsedColResponse(entry.getKey(), entry.getValue(), data);
         }
 

http://git-wip-us.apache.org/repos/asf/kylin/blob/7a9f74c8/server-base/src/main/java/org/apache/kylin/rest/controller2/ModelDescControllerV2.java
----------------------------------------------------------------------
diff --git 
a/server-base/src/main/java/org/apache/kylin/rest/controller2/ModelDescControllerV2.java
 
b/server-base/src/main/java/org/apache/kylin/rest/controller2/ModelDescControllerV2.java
index 5deced3..88089f5 100644
--- 
a/server-base/src/main/java/org/apache/kylin/rest/controller2/ModelDescControllerV2.java
+++ 
b/server-base/src/main/java/org/apache/kylin/rest/controller2/ModelDescControllerV2.java
@@ -62,27 +62,27 @@ public class ModelDescControllerV2 extends BasicController {
 
     /**
      * Get detail information of the "Model ID"
-     * 
+     *
      * @param modelName
      *            Model ID
      * @return
      * @throws IOException
      */
-    @RequestMapping(value = "/{modelName}", method = { RequestMethod.GET }, 
produces = {
+    @RequestMapping(value = "/{projectName}/{modelName}", method = { 
RequestMethod.GET }, produces = {
             "application/vnd.apache.kylin-v2+json" })
     @ResponseBody
-    public EnvelopeResponse getModelV2(@PathVariable String modelName) throws 
IOException {
+    public EnvelopeResponse getModelV2(@PathVariable String projectName, 
@PathVariable String modelName) throws IOException {
         Message msg = MsgPicker.getMsg();
 
         KylinConfig config = KylinConfig.getInstanceFromEnv();
         MetadataManager metaMgr = MetadataManager.getInstance(config);
-        
-        DataModelDesc model = metaMgr.getDataModelDesc(modelName);
-        Draft draft = modelService.getModelDraft(modelName);
-        
+
+        DataModelDesc model = modelService.getModel(modelName, projectName);
+        Draft draft = modelService.getModelDraft(modelName, projectName);
+
         if (model == null && draft == null)
             throw new 
BadRequestException(String.format(msg.getMODEL_NOT_FOUND(), modelName));
-        
+
         // figure out project
         String project = null;
         if (model != null) {
@@ -90,7 +90,7 @@ public class ModelDescControllerV2 extends BasicController {
         } else {
             project = draft.getProject();
         }
-        
+
         // result
         HashMap<String, DataModelDescResponse> result = new HashMap<String, 
DataModelDescResponse>();
         if (model != null) {

http://git-wip-us.apache.org/repos/asf/kylin/blob/7a9f74c8/server-base/src/main/java/org/apache/kylin/rest/controller2/StreamingControllerV2.java
----------------------------------------------------------------------
diff --git 
a/server-base/src/main/java/org/apache/kylin/rest/controller2/StreamingControllerV2.java
 
b/server-base/src/main/java/org/apache/kylin/rest/controller2/StreamingControllerV2.java
index 5e93e59..54733ea 100644
--- 
a/server-base/src/main/java/org/apache/kylin/rest/controller2/StreamingControllerV2.java
+++ 
b/server-base/src/main/java/org/apache/kylin/rest/controller2/StreamingControllerV2.java
@@ -81,6 +81,7 @@ public class StreamingControllerV2 extends BasicController {
             "application/vnd.apache.kylin-v2+json" })
     @ResponseBody
     public EnvelopeResponse getStreamingsV2(@RequestParam(value = "table", 
required = false) String table,
+            @RequestParam(value = "project", required = true) String project,
             @RequestParam(value = "pageOffset", required = false, defaultValue 
= "0") Integer pageOffset,
             @RequestParam(value = "pageSize", required = false, defaultValue = 
"10") Integer pageSize)
             throws IOException {
@@ -89,7 +90,7 @@ public class StreamingControllerV2 extends BasicController {
         int limit = pageSize;
 
         return new EnvelopeResponse(ResponseCode.CODE_SUCCESS,
-                streamingService.getStreamingConfigs(table, limit, offset), 
"");
+                streamingService.getStreamingConfigs(table, project, limit, 
offset), "");
     }
 
     @RequestMapping(value = "/getKfkConfig", method = { RequestMethod.GET }, 
produces = {
@@ -97,6 +98,7 @@ public class StreamingControllerV2 extends BasicController {
     @ResponseBody
     public EnvelopeResponse getKafkaConfigsV2(
             @RequestParam(value = "kafkaConfigName", required = false) String 
kafkaConfigName,
+            @RequestParam(value = "project", required = true) String project,
             @RequestParam(value = "pageOffset", required = false, defaultValue 
= "0") Integer pageOffset,
             @RequestParam(value = "pageSize", required = false, defaultValue = 
"10") Integer pageSize)
             throws IOException {
@@ -105,7 +107,7 @@ public class StreamingControllerV2 extends BasicController {
         int limit = pageSize;
 
         return new EnvelopeResponse(ResponseCode.CODE_SUCCESS,
-                kafkaConfigService.getKafkaConfigs(kafkaConfigName, limit, 
offset), "");
+                kafkaConfigService.getKafkaConfigs(kafkaConfigName, project, 
limit, offset), "");
     }
 
     /**
@@ -145,7 +147,7 @@ public class StreamingControllerV2 extends BasicController {
             }
             try {
                 streamingConfig.setUuid(UUID.randomUUID().toString());
-                streamingService.createStreamingConfig(streamingConfig);
+                streamingService.createStreamingConfig(streamingConfig, 
project);
                 saveStreamingSuccess = true;
             } catch (IOException e) {
                 logger.error("Failed to save StreamingConfig:" + 
e.getLocalizedMessage(), e);
@@ -153,11 +155,11 @@ public class StreamingControllerV2 extends 
BasicController {
             }
             try {
                 kafkaConfig.setUuid(UUID.randomUUID().toString());
-                kafkaConfigService.createKafkaConfig(kafkaConfig);
+                kafkaConfigService.createKafkaConfig(kafkaConfig, project);
                 saveKafkaSuccess = true;
             } catch (IOException e) {
                 try {
-                    streamingService.dropStreamingConfig(streamingConfig);
+                    streamingService.dropStreamingConfig(streamingConfig, 
project);
                 } catch (IOException e1) {
                     throw new 
InternalErrorException(msg.getCREATE_KAFKA_CONFIG_FAIL());
                 }
@@ -171,15 +173,15 @@ public class StreamingControllerV2 extends 
BasicController {
                     StreamingConfig sConfig = 
streamingService.getStreamingManager()
                             .getStreamingConfig(streamingConfig.getName());
                     try {
-                        streamingService.dropStreamingConfig(sConfig);
+                        streamingService.dropStreamingConfig(sConfig, project);
                     } catch (IOException e) {
                         throw new 
InternalErrorException(msg.getROLLBACK_STREAMING_CONFIG_FAIL());
                     }
                 }
                 if (saveKafkaSuccess == true) {
                     try {
-                        KafkaConfig kConfig = 
kafkaConfigService.getKafkaConfig(kafkaConfig.getName());
-                        kafkaConfigService.dropKafkaConfig(kConfig);
+                        KafkaConfig kConfig = 
kafkaConfigService.getKafkaConfig(kafkaConfig.getName(), project);
+                        kafkaConfigService.dropKafkaConfig(kConfig, project);
                     } catch (IOException e) {
                         throw new 
InternalErrorException(msg.getROLLBACK_KAFKA_CONFIG_FAIL());
                     }
@@ -196,36 +198,37 @@ public class StreamingControllerV2 extends 
BasicController {
 
         StreamingConfig streamingConfig = 
deserializeSchemalDescV2(streamingRequest);
         KafkaConfig kafkaConfig = 
deserializeKafkaSchemalDescV2(streamingRequest);
+        String project = streamingRequest.getProject();
 
         if (streamingConfig == null) {
             throw new 
BadRequestException(msg.getINVALID_STREAMING_CONFIG_DEFINITION());
         }
         try {
-            streamingService.updateStreamingConfig(streamingConfig);
+            streamingService.updateStreamingConfig(streamingConfig, project);
         } catch (AccessDeniedException accessDeniedException) {
             throw new 
ForbiddenException(msg.getUPDATE_STREAMING_CONFIG_NO_RIGHT());
         }
 
         try {
-            kafkaConfigService.updateKafkaConfig(kafkaConfig);
+            kafkaConfigService.updateKafkaConfig(kafkaConfig, project);
         } catch (AccessDeniedException accessDeniedException) {
             throw new 
ForbiddenException(msg.getUPDATE_KAFKA_CONFIG_NO_RIGHT());
         }
     }
 
-    @RequestMapping(value = "/{configName}", method = { RequestMethod.DELETE 
}, produces = {
+    @RequestMapping(value = "/{project}/{configName}", method = { 
RequestMethod.DELETE }, produces = {
             "application/vnd.apache.kylin-v2+json" })
     @ResponseBody
-    public void deleteConfigV2(@PathVariable String configName) throws 
IOException {
+    public void deleteConfigV2(@PathVariable String project, @PathVariable 
String configName) throws IOException {
         Message msg = MsgPicker.getMsg();
 
         StreamingConfig config = 
streamingService.getStreamingManager().getStreamingConfig(configName);
-        KafkaConfig kafkaConfig = 
kafkaConfigService.getKafkaConfig(configName);
+        KafkaConfig kafkaConfig = 
kafkaConfigService.getKafkaConfig(configName, project);
         if (null == config) {
             throw new 
BadRequestException(String.format(msg.getSTREAMING_CONFIG_NOT_FOUND(), 
configName));
         }
-        streamingService.dropStreamingConfig(config);
-        kafkaConfigService.dropKafkaConfig(kafkaConfig);
+        streamingService.dropStreamingConfig(config, project);
+        kafkaConfigService.dropKafkaConfig(kafkaConfig, project);
     }
 
     private TableDesc deserializeTableDescV2(StreamingRequest 
streamingRequest) throws IOException {

http://git-wip-us.apache.org/repos/asf/kylin/blob/7a9f74c8/server-base/src/main/java/org/apache/kylin/rest/controller2/TableControllerV2.java
----------------------------------------------------------------------
diff --git 
a/server-base/src/main/java/org/apache/kylin/rest/controller2/TableControllerV2.java
 
b/server-base/src/main/java/org/apache/kylin/rest/controller2/TableControllerV2.java
index 5a500b8..39c6c32 100644
--- 
a/server-base/src/main/java/org/apache/kylin/rest/controller2/TableControllerV2.java
+++ 
b/server-base/src/main/java/org/apache/kylin/rest/controller2/TableControllerV2.java
@@ -79,7 +79,7 @@ public class TableControllerV2 extends BasicController {
      * @return Table metadata array
      * @throws IOException
      */
-    @RequestMapping(value = "/{tableName:.+}", method = { RequestMethod.GET }, 
produces = {
+    @RequestMapping(value = "/{project}/{tableName:.+}", method = { 
RequestMethod.GET }, produces = {
             "application/vnd.apache.kylin-v2+json" })
     @ResponseBody
     public EnvelopeResponse getTableDescV2(@PathVariable String tableName, 
@PathVariable String project) {

http://git-wip-us.apache.org/repos/asf/kylin/blob/7a9f74c8/server-base/src/main/java/org/apache/kylin/rest/service/AccessService.java
----------------------------------------------------------------------
diff --git 
a/server-base/src/main/java/org/apache/kylin/rest/service/AccessService.java 
b/server-base/src/main/java/org/apache/kylin/rest/service/AccessService.java
index ae7ac6e..a46b866 100644
--- a/server-base/src/main/java/org/apache/kylin/rest/service/AccessService.java
+++ b/server-base/src/main/java/org/apache/kylin/rest/service/AccessService.java
@@ -273,6 +273,11 @@ public class AccessService {
         return AclEntityFactory.createAclEntity(entityType, uuid);
     }
 
+    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN +
+            " or hasPermission(#ae, 'ADMINISTRATION')" +
+            " or hasPermission(#ae, 'MANAGEMENT')" +
+            " or hasPermission(#ae, 'OPERATION')" +
+            " or hasPermission(#ae, 'READ')")
     public Acl getAcl(AclEntity ae) {
         if (null == ae) {
             return null;

http://git-wip-us.apache.org/repos/asf/kylin/blob/7a9f74c8/server-base/src/main/java/org/apache/kylin/rest/service/CubeService.java
----------------------------------------------------------------------
diff --git 
a/server-base/src/main/java/org/apache/kylin/rest/service/CubeService.java 
b/server-base/src/main/java/org/apache/kylin/rest/service/CubeService.java
index 4820ccd..16e94c7 100644
--- a/server-base/src/main/java/org/apache/kylin/rest/service/CubeService.java
+++ b/server-base/src/main/java/org/apache/kylin/rest/service/CubeService.java
@@ -58,13 +58,12 @@ import org.apache.kylin.rest.request.MetricsRequest;
 import org.apache.kylin.rest.response.HBaseResponse;
 import org.apache.kylin.rest.response.MetricsResponse;
 import org.apache.kylin.rest.security.AclPermission;
-import org.apache.kylin.rest.util.AclUtil;
+import org.apache.kylin.rest.util.AclEvaluate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.security.access.AccessDeniedException;
-import org.springframework.security.access.prepost.PostFilter;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.stereotype.Component;
@@ -99,18 +98,19 @@ public class CubeService extends BasicService {
     private ModelService modelService;
 
     @Autowired
-    private AclUtil aclUtil;
+    private AclEvaluate aclEvaluate;
 
-    @PostFilter(Constant.ACCESS_POST_FILTER_READ)
     public List<CubeInstance> listAllCubes(final String cubeName, final String 
projectName, final String modelName,
-            boolean exactMatch) {
+                                           boolean exactMatch) {
         List<CubeInstance> cubeInstances = null;
         ProjectInstance project = (null != projectName) ? 
getProjectManager().getProject(projectName) : null;
 
         if (null == project) {
             cubeInstances = getCubeManager().listAllCubes();
+            aclEvaluate.checkIsGlobalAdmin();
         } else {
             cubeInstances = listAllCubes(projectName);
+            aclEvaluate.hasProjectReadPermission(project);
         }
 
         List<CubeInstance> filterModelCubes = new ArrayList<CubeInstance>();
@@ -141,10 +141,8 @@ public class CubeService extends BasicService {
         return filterCubes;
     }
 
-    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN
-            + " or hasPermission(#cube, 'ADMINISTRATION') or 
hasPermission(#cube, 'MANAGEMENT')")
     public CubeInstance updateCubeCost(CubeInstance cube, int cost) throws 
IOException {
-
+        aclEvaluate.hasProjectWritePermission(cube.getProjectInstance());
         if (cube.getCost() == cost) {
             // Do nothing
             return cube;
@@ -235,10 +233,9 @@ public class CubeService extends BasicService {
         return false;
     }
 
-    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN
-            + " or hasPermission(#cube, 'ADMINISTRATION') or 
hasPermission(#cube, 'MANAGEMENT')")
     public CubeDesc updateCubeAndDesc(CubeInstance cube, CubeDesc desc, String 
newProjectName, boolean forceUpdate)
             throws IOException {
+        aclEvaluate.hasProjectWritePermission(cube.getProjectInstance());
         Message msg = MsgPicker.getMsg();
 
         final List<CubingJob> cubingJobs = 
jobService.listJobsByRealizationName(cube.getName(), null,
@@ -268,9 +265,8 @@ public class CubeService extends BasicService {
         return updatedCubeDesc;
     }
 
-    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN
-            + " or hasPermission(#cube, 'ADMINISTRATION') or 
hasPermission(#cube, 'MANAGEMENT')")
     public void deleteCube(CubeInstance cube) throws IOException {
+        aclEvaluate.hasProjectWritePermission(cube.getProjectInstance());
         Message msg = MsgPicker.getMsg();
 
         final List<CubingJob> cubingJobs = 
jobService.listJobsByRealizationName(cube.getName(), null,
@@ -299,9 +295,8 @@ public class CubeService extends BasicService {
      * @throws IOException
      * @throws JobException
      */
-    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN
-            + " or hasPermission(#cube, 'ADMINISTRATION') or 
hasPermission(#cube, 'OPERATION') or hasPermission(#cube, 'MANAGEMENT')")
     public CubeInstance purgeCube(CubeInstance cube) throws IOException {
+        aclEvaluate.hasProjectOperationPermission(cube.getProjectInstance());
         Message msg = MsgPicker.getMsg();
 
         String cubeName = cube.getName();
@@ -322,9 +317,8 @@ public class CubeService extends BasicService {
      * @throws IOException
      * @throws JobException
      */
-    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN
-            + " or hasPermission(#cube, 'ADMINISTRATION') or 
hasPermission(#cube, 'OPERATION') or hasPermission(#cube, 'MANAGEMENT')")
     public CubeInstance disableCube(CubeInstance cube) throws IOException {
+        aclEvaluate.hasProjectWritePermission(cube.getProjectInstance());
         Message msg = MsgPicker.getMsg();
 
         String cubeName = cube.getName();
@@ -352,9 +346,8 @@ public class CubeService extends BasicService {
      * @return
      * @throws IOException
      */
-    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN
-            + " or hasPermission(#cube, 'ADMINISTRATION') or 
hasPermission(#cube, 'OPERATION')  or hasPermission(#cube, 'MANAGEMENT')")
     public CubeInstance enableCube(CubeInstance cube) throws IOException {
+        aclEvaluate.hasProjectWritePermission(cube.getProjectInstance());
         Message msg = MsgPicker.getMsg();
 
         String cubeName = cube.getName();
@@ -441,27 +434,24 @@ public class CubeService extends BasicService {
         return hr;
     }
 
-    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN
-            + " or hasPermission(#cube, 'ADMINISTRATION') or 
hasPermission(#cube, 'OPERATION')  or hasPermission(#cube, 'MANAGEMENT')")
     public void updateCubeNotifyList(CubeInstance cube, List<String> 
notifyList) throws IOException {
+        aclEvaluate.hasProjectOperationPermission(cube.getProjectInstance());
         CubeDesc desc = cube.getDescriptor();
         desc.setNotifyList(notifyList);
         getCubeDescManager().updateCubeDesc(desc);
     }
 
-    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN
-            + " or hasPermission(#cube, 'ADMINISTRATION') or 
hasPermission(#cube, 'OPERATION')  or hasPermission(#cube, 'MANAGEMENT')")
     public CubeInstance rebuildLookupSnapshot(CubeInstance cube, String 
segmentName, String lookupTable)
             throws IOException {
+        aclEvaluate.hasProjectOperationPermission(cube.getProjectInstance());
         CubeSegment seg = cube.getSegment(segmentName, 
SegmentStatusEnum.READY);
         getCubeManager().buildSnapshotTable(seg, lookupTable);
 
         return cube;
     }
 
-    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN
-            + " or hasPermission(#cube, 'ADMINISTRATION') or 
hasPermission(#cube, 'OPERATION')  or hasPermission(#cube, 'MANAGEMENT')")
     public CubeInstance deleteSegment(CubeInstance cube, String segmentName) 
throws IOException {
+        aclEvaluate.hasProjectOperationPermission(cube.getProjectInstance());
         Message msg = MsgPicker.getMsg();
 
         if (!segmentName.equals(cube.getSegments().get(0).getName())
@@ -641,7 +631,7 @@ public class CubeService extends BasicService {
     }
 
     @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN
-            + " or hasPermission(#cube, 'ADMINISTRATION') or 
hasPermission(#cube, 'MANAGEMENT')")
+            + " or hasPermission(#project, 'ADMINISTRATION') or 
hasPermission(#project, 'MANAGEMENT')")
     public void saveDraft(ProjectInstance project, CubeInstance cube, String 
uuid, RootPersistentEntity... entities)
             throws IOException {
         Draft draft = new Draft();
@@ -662,12 +652,12 @@ public class CubeService extends BasicService {
     }
 
     public void deleteDraft(Draft draft) throws IOException {
+        
aclEvaluate.hasProjectWritePermission(getProjectManager().getProject(draft.getProject()));
         getDraftManager().delete(draft.getUuid());
     }
 
-    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN
-            + " or hasPermission(#cube, 'ADMINISTRATION') or 
hasPermission(#cube, 'MANAGEMENT')")
     public CubeDesc updateCube(CubeInstance cube, CubeDesc desc, 
ProjectInstance project) throws IOException {
+        aclEvaluate.hasProjectWritePermission(cube.getProjectInstance());
         Message msg = MsgPicker.getMsg();
         String projectName = project.getName();
 
@@ -690,8 +680,8 @@ public class CubeService extends BasicService {
         return desc;
     }
 
-    public Draft getCubeDraft(String cubeName) throws IOException {
-        for (Draft d : listCubeDrafts(cubeName, null, null, true)) {
+    public Draft getCubeDraft(String cubeName, String projectName) throws 
IOException {
+        for (Draft d : listCubeDrafts(cubeName, null, projectName, true)) {
             return d;
         }
         return null;
@@ -699,6 +689,11 @@ public class CubeService extends BasicService {
 
     public List<Draft> listCubeDrafts(String cubeName, String modelName, 
String project, boolean exactMatch)
             throws IOException {
+        if (null == project) {
+            aclEvaluate.checkIsGlobalAdmin();
+        } else {
+            
aclEvaluate.hasProjectReadPermission(getProjectManager().getProject(project));
+        }
         List<Draft> result = new ArrayList<>();
 
         for (Draft d : getDraftManager().list(project)) {
@@ -712,34 +707,6 @@ public class CubeService extends BasicService {
                 }
             }
         }
-
-        List<Draft> filtered = new ArrayList<>();
-
-        // if cube's there, follow cube permission. otherwise follow project 
permission
-        for (Draft d : result) {
-            CubeDesc desc = (CubeDesc) d.getEntity();
-            CubeInstance cube = getCubeManager().getCube(desc.getName());
-
-            if (cube == null) {
-                try {
-                    project = project == null ? d.getProject() : project;
-                    if 
(aclUtil.hasProjectReadPermission(getProjectManager().getProject(project))) {
-                        filtered.add(d);
-                    }
-                } catch (Exception e) {
-                    // do nothing
-                }
-            } else {
-                try {
-                    if (aclUtil.hasCubeReadPermission(cube)) {
-                        filtered.add(d);
-                    }
-                } catch (Exception e) {
-                    // do nothing
-                }
-            }
-        }
-
-        return filtered;
+        return result;
     }
 }

http://git-wip-us.apache.org/repos/asf/kylin/blob/7a9f74c8/server-base/src/main/java/org/apache/kylin/rest/service/DiagnosisService.java
----------------------------------------------------------------------
diff --git 
a/server-base/src/main/java/org/apache/kylin/rest/service/DiagnosisService.java 
b/server-base/src/main/java/org/apache/kylin/rest/service/DiagnosisService.java
index 35b018c..50f9c56 100644
--- 
a/server-base/src/main/java/org/apache/kylin/rest/service/DiagnosisService.java
+++ 
b/server-base/src/main/java/org/apache/kylin/rest/service/DiagnosisService.java
@@ -27,13 +27,13 @@ import org.apache.kylin.common.KylinConfig;
 import org.apache.kylin.common.util.CliCommandExecutor;
 import org.apache.kylin.common.util.Pair;
 import org.apache.kylin.metadata.badquery.BadQueryHistory;
-import org.apache.kylin.rest.constant.Constant;
 import org.apache.kylin.rest.exception.BadRequestException;
 import org.apache.kylin.rest.msg.Message;
 import org.apache.kylin.rest.msg.MsgPicker;
+import org.apache.kylin.rest.util.AclEvaluate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import com.google.common.io.Files;
@@ -47,6 +47,12 @@ public class DiagnosisService extends BasicService {
         return Files.createTempDir();
     }
 
+    @Autowired
+    private AclEvaluate aclEvaluate;
+
+    @Autowired
+    private JobService jobService;
+
     private String getDiagnosisPackageName(File destDir) {
         Message msg = MsgPicker.getMsg();
 
@@ -66,23 +72,23 @@ public class DiagnosisService extends BasicService {
         throw new 
BadRequestException(String.format(msg.getDIAG_PACKAGE_NOT_FOUND(), 
destDir.getAbsolutePath()));
     }
 
-    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN)
     public BadQueryHistory getProjectBadQueryHistory(String project) throws 
IOException {
+        aclEvaluate.checkProjectOperationPermission(project);
         return getBadQueryHistoryManager().getBadQueriesForProject(project);
     }
 
-    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN)
     public String dumpProjectDiagnosisInfo(String project) throws IOException {
+        aclEvaluate.checkProjectOperationPermission(project);
         File exportPath = getDumpDir();
         String[] args = { project, exportPath.getAbsolutePath() };
         runDiagnosisCLI(args);
         return getDiagnosisPackageName(exportPath);
     }
 
-    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN)
     public String dumpJobDiagnosisInfo(String jobId) throws IOException {
+        
aclEvaluate.checkProjectOperationPermission(jobService.getJobInstance(jobId));
         File exportPath = getDumpDir();
-        String[] args = { jobId, exportPath.getAbsolutePath() };
+        String[] args = {jobId, exportPath.getAbsolutePath()};
         runDiagnosisCLI(args);
         return getDiagnosisPackageName(exportPath);
     }

http://git-wip-us.apache.org/repos/asf/kylin/blob/7a9f74c8/server-base/src/main/java/org/apache/kylin/rest/service/HybridService.java
----------------------------------------------------------------------
diff --git 
a/server-base/src/main/java/org/apache/kylin/rest/service/HybridService.java 
b/server-base/src/main/java/org/apache/kylin/rest/service/HybridService.java
index b718edf..cad39b4 100644
--- a/server-base/src/main/java/org/apache/kylin/rest/service/HybridService.java
+++ b/server-base/src/main/java/org/apache/kylin/rest/service/HybridService.java
@@ -27,13 +27,12 @@ import org.apache.kylin.metadata.model.DataModelDesc;
 import org.apache.kylin.metadata.project.ProjectInstance;
 import org.apache.kylin.metadata.project.RealizationEntry;
 import org.apache.kylin.metadata.realization.RealizationType;
-import org.apache.kylin.rest.constant.Constant;
 import org.apache.kylin.rest.job.HybridCubeCLI;
+import org.apache.kylin.rest.util.AclEvaluate;
 import org.apache.kylin.storage.hybrid.HybridInstance;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.security.access.prepost.PostFilter;
-import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 @Component("hybridService")
@@ -41,8 +40,11 @@ public class HybridService extends BasicService {
 
     private static final Logger logger = 
LoggerFactory.getLogger(HybridService.class);
 
-    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN)
+    @Autowired
+    private AclEvaluate aclEvaluate;
+
     public HybridInstance createHybridCube(String hybridName, String 
projectName, String modelName, String[] cubeNames) {
+        aclEvaluate.checkProjectWritePermission(projectName);
         List<String> args = new ArrayList<String>();
         args.add("-name");
         args.add(hybridName);
@@ -63,8 +65,8 @@ public class HybridService extends BasicService {
         return getHybridInstance(hybridName);
     }
 
-    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN + " or hasPermission(#cube, 
'ADMINISTRATION') or hasPermission(#cube, 'MANAGEMENT')")
     public HybridInstance updateHybridCube(String hybridName, String 
projectName, String modelName, String[] cubeNames) {
+        aclEvaluate.checkProjectWritePermission(projectName);
         List<String> args = new ArrayList<String>();
         args.add("-name");
         args.add(hybridName);
@@ -85,8 +87,8 @@ public class HybridService extends BasicService {
         return getHybridInstance(hybridName);
     }
 
-    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN + " or hasPermission(#cube, 
'ADMINISTRATION') or hasPermission(#cube, 'MANAGEMENT')")
     public void deleteHybridCube(String hybridName, String projectName, String 
modelName) {
+        aclEvaluate.checkProjectWritePermission(projectName);
         List<String> args = new ArrayList<String>();
         args.add("-name");
         args.add(hybridName);
@@ -109,8 +111,8 @@ public class HybridService extends BasicService {
         return hybridInstance;
     }
 
-    @PostFilter(Constant.ACCESS_POST_FILTER_READ)
     public List<HybridInstance> listHybrids(final String projectName, final 
String modelName) {
+        aclEvaluate.checkProjectReadPermission(projectName);
         ProjectInstance project = (null != projectName) ? 
getProjectManager().getProject(projectName) : null;
         List<HybridInstance> hybridsInProject = new 
ArrayList<HybridInstance>();
 

http://git-wip-us.apache.org/repos/asf/kylin/blob/7a9f74c8/server-base/src/main/java/org/apache/kylin/rest/service/JobService.java
----------------------------------------------------------------------
diff --git 
a/server-base/src/main/java/org/apache/kylin/rest/service/JobService.java 
b/server-base/src/main/java/org/apache/kylin/rest/service/JobService.java
index 5dafa08..346b131 100644
--- a/server-base/src/main/java/org/apache/kylin/rest/service/JobService.java
+++ b/server-base/src/main/java/org/apache/kylin/rest/service/JobService.java
@@ -50,10 +50,10 @@ import org.apache.kylin.job.execution.Output;
 import org.apache.kylin.job.lock.JobLock;
 import org.apache.kylin.metadata.model.SegmentStatusEnum;
 import org.apache.kylin.metadata.realization.RealizationStatusEnum;
-import org.apache.kylin.rest.constant.Constant;
 import org.apache.kylin.rest.exception.BadRequestException;
 import org.apache.kylin.rest.msg.Message;
 import org.apache.kylin.rest.msg.MsgPicker;
+import org.apache.kylin.rest.util.AclEvaluate;
 import org.apache.kylin.source.ISource;
 import org.apache.kylin.source.SourceFactory;
 import org.apache.kylin.source.SourcePartition;
@@ -63,7 +63,6 @@ import org.springframework.beans.factory.InitializingBean;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.EnableAspectJAutoProxy;
-import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Nullable;
@@ -93,6 +92,9 @@ public class JobService extends BasicService implements 
InitializingBean {
     @Qualifier("accessService")
     private AccessService accessService;
 
+    @Autowired
+    private AclEvaluate aclEvaluate;
+
     /*
     * (non-Javadoc)
     *
@@ -198,11 +200,10 @@ public class JobService extends BasicService implements 
InitializingBean {
         }
     }
 
-    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN
-            + " or hasPermission(#cube, 'ADMINISTRATION') or 
hasPermission(#cube, 'OPERATION') or hasPermission(#cube, 'MANAGEMENT')")
     public JobInstance submitJob(CubeInstance cube, long startDate, long 
endDate, long startOffset, long endOffset, //
-                                 Map<Integer, Long> 
sourcePartitionOffsetStart, Map<Integer, Long> sourcePartitionOffsetEnd,
-                                 CubeBuildTypeEnum buildType, boolean force, 
String submitter) throws IOException {
+            Map<Integer, Long> sourcePartitionOffsetStart, Map<Integer, Long> 
sourcePartitionOffsetEnd,
+            CubeBuildTypeEnum buildType, boolean force, String submitter) 
throws IOException {
+        aclEvaluate.checkProjectOperationPermission(cube);
         JobInstance jobInstance = submitJobInternal(cube, startDate, endDate, 
startOffset, endOffset, sourcePartitionOffsetStart,
                 sourcePartitionOffsetEnd, buildType, force, submitter);
 
@@ -313,21 +314,18 @@ public class JobService extends BasicService implements 
InitializingBean {
         return result;
     }
 
-    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN
-            + " or hasPermission(#job, 'ADMINISTRATION') or 
hasPermission(#job, 'OPERATION') or hasPermission(#job, 'MANAGEMENT')")
     public void resumeJob(JobInstance job) {
+        aclEvaluate.checkProjectOperationPermission(job);
         getExecutableManager().resumeJob(job.getId());
     }
 
-    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN
-            + " or hasPermission(#job, 'ADMINISTRATION') or 
hasPermission(#job, 'OPERATION') or hasPermission(#job, 'MANAGEMENT')")
     public void rollbackJob(JobInstance job, String stepId) {
+        aclEvaluate.checkProjectOperationPermission(job);
         getExecutableManager().rollbackJob(job.getId(), stepId);
     }
 
-    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN
-            + " or hasPermission(#job, 'ADMINISTRATION') or 
hasPermission(#job, 'OPERATION') or hasPermission(#job, 'MANAGEMENT')")
     public JobInstance cancelJob(JobInstance job) throws IOException {
+        aclEvaluate.checkProjectOperationPermission(job);
         if (null == job.getRelatedCube() || null == 
getCubeManager().getCube(job.getRelatedCube()) || null == 
job.getRelatedSegment()) {
             getExecutableManager().discardJob(job.getId());
             return job;
@@ -349,16 +347,14 @@ public class JobService extends BasicService implements 
InitializingBean {
         return job;
     }
 
-    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN
-            + " or hasPermission(#job, 'ADMINISTRATION') or 
hasPermission(#job, 'OPERATION') or hasPermission(#job, 'MANAGEMENT')")
     public JobInstance pauseJob(JobInstance job) {
+        aclEvaluate.checkProjectOperationPermission(job);
         getExecutableManager().pauseJob(job.getId());
         return job;
     }
 
-    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN
-            + " or hasPermission(#job, 'ADMINISTRATION') or 
hasPermission(#job, 'OPERATION') or hasPermission(#job, 'MANAGEMENT')")
     public void dropJob(JobInstance job) throws IOException {
+        aclEvaluate.checkProjectOperationPermission(job);
         getExecutableManager().deleteJob(job.getId());
     }
 
@@ -397,7 +393,12 @@ public class JobService extends BasicService implements 
InitializingBean {
     }
 
     public List<JobInstance> innerSearchCubingJobs(final String cubeName, 
final String jobName,
-                                                   final String projectName, 
final List<JobStatusEnum> statusList, final JobTimeFilterEnum timeFilter) {
+            final String projectName, final List<JobStatusEnum> statusList, 
final JobTimeFilterEnum timeFilter) {
+        if (null == projectName) {
+            aclEvaluate.checkIsGlobalAdmin();
+        } else {
+            aclEvaluate.checkProjectOperationPermission(projectName);
+        }
         // prepare time range
         Calendar calendar = Calendar.getInstance();
         calendar.setTime(new Date());

http://git-wip-us.apache.org/repos/asf/kylin/blob/7a9f74c8/server-base/src/main/java/org/apache/kylin/rest/service/KafkaConfigService.java
----------------------------------------------------------------------
diff --git 
a/server-base/src/main/java/org/apache/kylin/rest/service/KafkaConfigService.java
 
b/server-base/src/main/java/org/apache/kylin/rest/service/KafkaConfigService.java
index 0dbe6f2..3983a30 100644
--- 
a/server-base/src/main/java/org/apache/kylin/rest/service/KafkaConfigService.java
+++ 
b/server-base/src/main/java/org/apache/kylin/rest/service/KafkaConfigService.java
@@ -22,18 +22,19 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.kylin.rest.constant.Constant;
 import org.apache.kylin.rest.exception.BadRequestException;
 import org.apache.kylin.rest.msg.Message;
 import org.apache.kylin.rest.msg.MsgPicker;
+import org.apache.kylin.rest.util.AclEvaluate;
 import org.apache.kylin.source.kafka.config.KafkaConfig;
-import org.springframework.security.access.prepost.PostFilter;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 @Component("kafkaMgmtService")
 public class KafkaConfigService extends BasicService {
+    @Autowired
+    private AclEvaluate aclEvaluate;
 
-    @PostFilter(Constant.ACCESS_POST_FILTER_READ)
     public List<KafkaConfig> listAllKafkaConfigs(final String kafkaConfigName) 
throws IOException {
         List<KafkaConfig> kafkaConfigs = new ArrayList<KafkaConfig>();
         //        CubeInstance cubeInstance = (null != cubeName) ? 
getCubeManager().getCube(cubeName) : null;
@@ -51,8 +52,8 @@ public class KafkaConfigService extends BasicService {
         return kafkaConfigs;
     }
 
-    public List<KafkaConfig> getKafkaConfigs(final String kafkaConfigName, 
final Integer limit, final Integer offset) throws IOException {
-
+    public List<KafkaConfig> getKafkaConfigs(final String kafkaConfigName, 
final String project, final Integer limit, final Integer offset) throws 
IOException {
+        aclEvaluate.checkProjectWritePermission(project);
         List<KafkaConfig> kafkaConfigs;
         kafkaConfigs = listAllKafkaConfigs(kafkaConfigName);
 
@@ -67,7 +68,8 @@ public class KafkaConfigService extends BasicService {
         return kafkaConfigs.subList(offset, offset + limit);
     }
 
-    public KafkaConfig createKafkaConfig(KafkaConfig config) throws 
IOException {
+    public KafkaConfig createKafkaConfig(KafkaConfig config, String project) 
throws IOException {
+        aclEvaluate.checkProjectWritePermission(project);
         Message msg = MsgPicker.getMsg();
 
         if (getKafkaManager().getKafkaConfig(config.getName()) != null) {
@@ -77,17 +79,18 @@ public class KafkaConfigService extends BasicService {
         return config;
     }
 
-    //    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN + " or 
hasPermission(#desc, 'ADMINISTRATION') or hasPermission(#desc, 'MANAGEMENT')")
-    public KafkaConfig updateKafkaConfig(KafkaConfig config) throws 
IOException {
+    public KafkaConfig updateKafkaConfig(KafkaConfig config, String project) 
throws IOException {
+        aclEvaluate.checkProjectWritePermission(project);
         return getKafkaManager().updateKafkaConfig(config);
     }
 
-    public KafkaConfig getKafkaConfig(String configName) throws IOException {
+    public KafkaConfig getKafkaConfig(String configName, String project) 
throws IOException {
+        aclEvaluate.checkProjectWritePermission(project);
         return getKafkaManager().getKafkaConfig(configName);
     }
 
-    //    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN + " or 
hasPermission(#desc, 'ADMINISTRATION') or hasPermission(#desc, 'MANAGEMENT')")
-    public void dropKafkaConfig(KafkaConfig config) throws IOException {
+    public void dropKafkaConfig(KafkaConfig config, String project) throws 
IOException {
+        aclEvaluate.checkProjectWritePermission(project);
         getKafkaManager().removeKafkaConfig(config);
     }
 }

http://git-wip-us.apache.org/repos/asf/kylin/blob/7a9f74c8/server-base/src/main/java/org/apache/kylin/rest/service/ModelService.java
----------------------------------------------------------------------
diff --git 
a/server-base/src/main/java/org/apache/kylin/rest/service/ModelService.java 
b/server-base/src/main/java/org/apache/kylin/rest/service/ModelService.java
index d95dff8..4efb894 100644
--- a/server-base/src/main/java/org/apache/kylin/rest/service/ModelService.java
+++ b/server-base/src/main/java/org/apache/kylin/rest/service/ModelService.java
@@ -37,19 +37,17 @@ import org.apache.kylin.metadata.model.ModelDimensionDesc;
 import org.apache.kylin.metadata.model.TableDesc;
 import org.apache.kylin.metadata.model.TblColRef;
 import org.apache.kylin.metadata.project.ProjectInstance;
-import org.apache.kylin.rest.constant.Constant;
 import org.apache.kylin.rest.exception.BadRequestException;
 import org.apache.kylin.rest.exception.ForbiddenException;
 import org.apache.kylin.rest.msg.Message;
 import org.apache.kylin.rest.msg.MsgPicker;
 import org.apache.kylin.rest.security.AclPermission;
+import org.apache.kylin.rest.util.AclEvaluate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.security.access.AccessDeniedException;
-import org.springframework.security.access.prepost.PostFilter;
-import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.stereotype.Component;
 
@@ -72,14 +70,18 @@ public class ModelService extends BasicService {
     @Qualifier("cubeMgmtService")
     private CubeService cubeService;
 
-    @PostFilter(Constant.ACCESS_POST_FILTER_READ)
+    @Autowired
+    private AclEvaluate aclEvaluate;
+
     public List<DataModelDesc> listAllModels(final String modelName, final 
String projectName, boolean exactMatch) throws IOException {
         List<DataModelDesc> models;
         ProjectInstance project = (null != projectName) ? 
getProjectManager().getProject(projectName) : null;
 
         if (null == project) {
+            aclEvaluate.checkIsGlobalAdmin();
             models = getMetadataManager().getModels();
         } else {
+            aclEvaluate.hasProjectReadPermission(project);
             models = getMetadataManager().getModels(projectName);
         }
 
@@ -114,6 +116,7 @@ public class ModelService extends BasicService {
     }
 
     public DataModelDesc createModelDesc(String projectName, DataModelDesc 
desc) throws IOException {
+        
aclEvaluate.hasProjectWritePermission(getProjectManager().getProject(projectName));
         Message msg = MsgPicker.getMsg();
 
         if (getMetadataManager().getDataModelDesc(desc.getName()) != null) {
@@ -131,19 +134,15 @@ public class ModelService extends BasicService {
         return createdDesc;
     }
 
-    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN
-            + " or hasPermission(#desc, 'ADMINISTRATION') or 
hasPermission(#desc, 'MANAGEMENT')")
     public DataModelDesc updateModelAndDesc(DataModelDesc desc) throws 
IOException {
-
+        aclEvaluate.hasProjectWritePermission(desc.getProjectInstance());
         getMetadataManager().updateDataModelDesc(desc);
         return desc;
     }
 
-    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN
-            + " or hasPermission(#desc, 'ADMINISTRATION') or 
hasPermission(#desc, 'MANAGEMENT')")
     public void dropModel(DataModelDesc desc) throws IOException {
+        aclEvaluate.hasProjectWritePermission(desc.getProjectInstance());
         Message msg = MsgPicker.getMsg();
-
         //check cube desc exist
         List<CubeDesc> cubeDescs = getCubeDescManager().listAllDesc();
         for (CubeDesc cubeDesc : cubeDescs) {
@@ -169,9 +168,9 @@ public class ModelService extends BasicService {
         return getMetadataManager().getModelsUsingTable(table, project);
     }
 
-    public Map<TblColRef, Set<CubeInstance>> getUsedDimCols(String modelName) {
+    public Map<TblColRef, Set<CubeInstance>> getUsedDimCols(String modelName, 
String project) {
         Map<TblColRef, Set<CubeInstance>> ret = Maps.newHashMap();
-        List<CubeInstance> cubeInstances = cubeService.listAllCubes(null, 
null, modelName, true);
+        List<CubeInstance> cubeInstances = cubeService.listAllCubes(null, 
project, modelName, true);
         for (CubeInstance cubeInstance : cubeInstances) {
             CubeDesc cubeDesc = cubeInstance.getDescriptor();
             for (TblColRef tblColRef : 
cubeDesc.listDimensionColumnsIncludingDerived()) {
@@ -186,9 +185,9 @@ public class ModelService extends BasicService {
         return ret;
     }
 
-    public Map<TblColRef, Set<CubeInstance>> getUsedNonDimCols(String 
modelName) {
+    public Map<TblColRef, Set<CubeInstance>> getUsedNonDimCols(String 
modelName, String project) {
         Map<TblColRef, Set<CubeInstance>> ret = Maps.newHashMap();
-        List<CubeInstance> cubeInstances = cubeService.listAllCubes(null, 
null, modelName, true);
+        List<CubeInstance> cubeInstances = cubeService.listAllCubes(null, 
project, modelName, true);
         for (CubeInstance cubeInstance : cubeInstances) {
             CubeDesc cubeDesc = cubeInstance.getDescriptor();
             Set<TblColRef> tblColRefs = 
Sets.newHashSet(cubeDesc.listAllColumns());//make a copy
@@ -205,9 +204,9 @@ public class ModelService extends BasicService {
         return ret;
     }
 
-    private boolean validateUpdatingModel(DataModelDesc dataModelDesc) throws 
IOException {
+    private boolean validateUpdatingModel(DataModelDesc dataModelDesc, String 
project) throws IOException {
         String modelName = dataModelDesc.getName();
-        List<CubeInstance> cubes = cubeService.listAllCubes(null, null, 
modelName, true);
+        List<CubeInstance> cubes = cubeService.listAllCubes(null, project, 
modelName, true);
         if (cubes != null && cubes.size() != 0) {
             dataModelDesc.init(getConfig(), 
getMetadataManager().getAllTablesMap(dataModelDesc.getProject()),
                     getMetadataManager().listDataModels());
@@ -231,8 +230,8 @@ public class ModelService extends BasicService {
                 dimAndMCols.add(measure);
             }
 
-            Set<TblColRef> usedDimCols = getUsedDimCols(modelName).keySet();
-            Set<TblColRef> usedNonDimCols = 
getUsedNonDimCols(modelName).keySet();
+            Set<TblColRef> usedDimCols = getUsedDimCols(modelName, 
project).keySet();
+            Set<TblColRef> usedNonDimCols = getUsedNonDimCols(modelName, 
project).keySet();
 
             for (TblColRef tblColRef : usedDimCols) {
                 if (!dimCols.contains(tblColRef.getTableAlias() + "." + 
tblColRef.getName()))
@@ -244,8 +243,7 @@ public class ModelService extends BasicService {
                     return false;
             }
 
-            DataModelDesc originDataModelDesc = listAllModels(modelName, null, 
true).get(0);
-
+            DataModelDesc originDataModelDesc = listAllModels(modelName, 
project, true).get(0);
             if 
(!dataModelDesc.getRootFactTable().equals(originDataModelDesc.getRootFactTable()))
                 return false;
 
@@ -276,6 +274,7 @@ public class ModelService extends BasicService {
     }
 
     public DataModelDesc updateModelToResourceStore(DataModelDesc modelDesc, 
String projectName) throws IOException {
+        
aclEvaluate.hasProjectWritePermission(getProjectManager().getProject(projectName));
         Message msg = MsgPicker.getMsg();
         
         modelDesc.setDraft(false);
@@ -288,7 +287,7 @@ public class ModelService extends BasicService {
                 modelDesc = createModelDesc(projectName, modelDesc);
             } else {
                 // update
-                if (!validateUpdatingModel(modelDesc)) {
+                if (!validateUpdatingModel(modelDesc, projectName)) {
                     throw new 
BadRequestException(msg.getUPDATE_MODEL_KEY_FIELD());
                 }
                 modelDesc = updateModelAndDesc(modelDesc);
@@ -304,17 +303,35 @@ public class ModelService extends BasicService {
         return modelDesc;
     }
 
-    public Draft getModelDraft(String modelName) throws IOException {
-        for (Draft d : listModelDrafts(modelName, null)) {
+    public DataModelDesc getModel(final String modelName, final String 
projectName) throws IOException {
+        ProjectInstance project = (null != projectName) ? 
getProjectManager().getProject(projectName) : null;
+        if (null == project) {
+            aclEvaluate.checkIsGlobalAdmin();
+        } else {
+            aclEvaluate.hasProjectReadPermission(project);
+        }
+
+        return getMetadataManager().getDataModelDesc(modelName);
+    }
+
+    public Draft getModelDraft(String modelName, String projectName) throws 
IOException {
+        for (Draft d : listModelDrafts(modelName, projectName)) {
             return d;
         }
         return null;
     }
-    
-    public List<Draft> listModelDrafts(String modelName, String project) 
throws IOException {
+
+    public List<Draft> listModelDrafts(String modelName,  String projectName) 
throws IOException {
+        ProjectInstance project = (null != projectName) ? 
getProjectManager().getProject(projectName) : null;
+        if (null == project) {
+            aclEvaluate.checkIsGlobalAdmin();
+        } else {
+            aclEvaluate.hasProjectReadPermission(project);
+        }
+
         List<Draft> result = new ArrayList<>();
-        
-        for (Draft d : getDraftManager().list(project)) {
+
+        for (Draft d : getDraftManager().list(projectName)) {
             RootPersistentEntity e = d.getEntity();
             if (e instanceof DataModelDesc) {
                 DataModelDesc m = (DataModelDesc) e;

http://git-wip-us.apache.org/repos/asf/kylin/blob/7a9f74c8/server-base/src/main/java/org/apache/kylin/rest/service/ProjectService.java
----------------------------------------------------------------------
diff --git 
a/server-base/src/main/java/org/apache/kylin/rest/service/ProjectService.java 
b/server-base/src/main/java/org/apache/kylin/rest/service/ProjectService.java
index cd60128..a369942 100644
--- 
a/server-base/src/main/java/org/apache/kylin/rest/service/ProjectService.java
+++ 
b/server-base/src/main/java/org/apache/kylin/rest/service/ProjectService.java
@@ -27,7 +27,6 @@ import java.util.List;
 import javax.annotation.Nullable;
 
 import org.apache.directory.api.util.Strings;
-import org.apache.kylin.cube.CubeInstance;
 import org.apache.kylin.metadata.draft.Draft;
 import org.apache.kylin.metadata.project.ProjectInstance;
 import org.apache.kylin.metadata.project.ProjectManager;
@@ -37,7 +36,7 @@ import org.apache.kylin.rest.exception.BadRequestException;
 import org.apache.kylin.rest.msg.Message;
 import org.apache.kylin.rest.msg.MsgPicker;
 import org.apache.kylin.rest.security.AclPermission;
-import org.apache.kylin.rest.util.AclUtil;
+import org.apache.kylin.rest.util.AclEvaluate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -70,7 +69,7 @@ public class ProjectService extends BasicService {
     private CubeService cubeService;
 
     @Autowired
-    private AclUtil aclUtil;
+    private AclEvaluate aclEvaluate;
 
     @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN)
     public ProjectInstance createProject(ProjectInstance newProject) throws 
IOException {
@@ -93,7 +92,7 @@ public class ProjectService extends BasicService {
         return createdProject;
     }
 
-    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN + " or 
hasPermission(#currentProject, 'ADMINISTRATION') or 
hasPermission(#currentProject, 'MANAGEMENT')")
+    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN + " or 
hasPermission(#currentProject, 'ADMINISTRATION')")
     public ProjectInstance updateProject(ProjectInstance newProject, 
ProjectInstance currentProject) throws IOException {
         if (!newProject.getName().equals(currentProject.getName())) {
             return renameProject(newProject, currentProject);
@@ -152,7 +151,7 @@ public class ProjectService extends BasicService {
         return projects.subList(coffset, coffset + climit);
     }
 
-    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN + " or 
hasPermission(#project, 'ADMINISTRATION') or hasPermission(#project, 
'MANAGEMENT')")
+    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN)
     public void deleteProject(String projectName, ProjectInstance project) 
throws IOException {
         getProjectManager().dropProject(projectName);
 
@@ -212,34 +211,18 @@ public class ProjectService extends BasicService {
 
             boolean hasProjectPermission = false;
             try {
-                hasProjectPermission = 
aclUtil.hasProjectReadPermission(projectInstance);
+                hasProjectPermission = 
aclEvaluate.hasProjectReadPermission(projectInstance);
             } catch (AccessDeniedException e) {
                 //ignore to continue
             }
 
-            if (!hasProjectPermission) {
-                List<CubeInstance> cubeInstances = 
cubeService.listAllCubes(projectInstance.getName());
-
-                for (CubeInstance cubeInstance : cubeInstances) {
-                    if (cubeInstance == null) {
-                        continue;
-                    }
-
-                    try {
-                        aclUtil.hasCubeReadPermission(cubeInstance);
-                        hasProjectPermission = true;
-                        break;
-                    } catch (AccessDeniedException e) {
-                        //ignore to continue
-                    }
-                }
-            }
             if (hasProjectPermission) {
                 readableProjects.add(projectInstance);
             }
 
         }
 
+        // listAll method may not need a single param.But almost all listAll 
method pass
         if (!Strings.isEmpty(projectName)) {
             readableProjects = Lists
                     
.newArrayList(Iterators.filter(readableProjects.iterator(), new 
Predicate<ProjectInstance>() {

http://git-wip-us.apache.org/repos/asf/kylin/blob/7a9f74c8/server-base/src/main/java/org/apache/kylin/rest/service/QueryService.java
----------------------------------------------------------------------
diff --git 
a/server-base/src/main/java/org/apache/kylin/rest/service/QueryService.java 
b/server-base/src/main/java/org/apache/kylin/rest/service/QueryService.java
index a2d6b4d..f469117 100644
--- a/server-base/src/main/java/org/apache/kylin/rest/service/QueryService.java
+++ b/server-base/src/main/java/org/apache/kylin/rest/service/QueryService.java
@@ -93,7 +93,7 @@ import org.apache.kylin.rest.msg.MsgPicker;
 import org.apache.kylin.rest.request.PrepareSqlRequest;
 import org.apache.kylin.rest.request.SQLRequest;
 import org.apache.kylin.rest.response.SQLResponse;
-import org.apache.kylin.rest.util.AclUtil;
+import org.apache.kylin.rest.util.AclEvaluate;
 import org.apache.kylin.query.util.PushDownUtil;
 import org.apache.kylin.rest.util.TableauInterceptor;
 import org.apache.kylin.storage.hybrid.HybridInstance;
@@ -142,7 +142,7 @@ public class QueryService extends BasicService {
     private ModelService modelService;
 
     @Autowired
-    private AclUtil aclUtil;
+    private AclEvaluate aclEvaluate;
 
     public QueryService() {
         queryStore = ResourceStore.getStore(getConfig());
@@ -231,7 +231,7 @@ public class QueryService extends BasicService {
     }
 
     public void logQuery(final SQLRequest request, final SQLResponse response) 
{
-        final String user = aclUtil.getCurrentUserName();
+        final String user = aclEvaluate.getCurrentUserName();
         final List<String> realizationNames = new LinkedList<>();
         final Set<Long> cuboidIds = new HashSet<Long>();
         float duration = response.getDuration() / (float) 1000;
@@ -289,7 +289,7 @@ public class QueryService extends BasicService {
         //project 
         ProjectInstance projectInstance = 
getProjectManager().getProject(project);
         try {
-            if (aclUtil.hasProjectReadPermission(projectInstance)) {
+            if (aclEvaluate.hasProjectReadPermission(projectInstance)) {
                 return;
             }
         } catch (AccessDeniedException e) {
@@ -325,7 +325,7 @@ public class QueryService extends BasicService {
     }
 
     private void checkCubeAuthorization(CubeInstance cube) throws 
AccessDeniedException {
-        Preconditions.checkState(aclUtil.hasCubeReadPermission(cube));
+        Preconditions.checkState(aclEvaluate.hasCubeReadPermission(cube));
     }
 
     private void checkHybridAuthorization(HybridInstance hybridInstance) 
throws AccessDeniedException {

http://git-wip-us.apache.org/repos/asf/kylin/blob/7a9f74c8/server-base/src/main/java/org/apache/kylin/rest/service/StreamingService.java
----------------------------------------------------------------------
diff --git 
a/server-base/src/main/java/org/apache/kylin/rest/service/StreamingService.java 
b/server-base/src/main/java/org/apache/kylin/rest/service/StreamingService.java
index adae67c..2871285 100644
--- 
a/server-base/src/main/java/org/apache/kylin/rest/service/StreamingService.java
+++ 
b/server-base/src/main/java/org/apache/kylin/rest/service/StreamingService.java
@@ -24,17 +24,18 @@ import java.util.List;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.kylin.metadata.streaming.StreamingConfig;
-import org.apache.kylin.rest.constant.Constant;
 import org.apache.kylin.rest.exception.BadRequestException;
 import org.apache.kylin.rest.msg.Message;
 import org.apache.kylin.rest.msg.MsgPicker;
-import org.springframework.security.access.prepost.PostFilter;
+import org.apache.kylin.rest.util.AclEvaluate;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 @Component("streamingMgmtService")
 public class StreamingService extends BasicService {
+    @Autowired
+    private AclEvaluate aclEvaluate;
 
-    @PostFilter(Constant.ACCESS_POST_FILTER_READ)
     public List<StreamingConfig> listAllStreamingConfigs(final String table) 
throws IOException {
         List<StreamingConfig> streamingConfigs = new ArrayList();
         if (StringUtils.isEmpty(table)) {
@@ -49,8 +50,8 @@ public class StreamingService extends BasicService {
         return streamingConfigs;
     }
 
-    public List<StreamingConfig> getStreamingConfigs(final String table, final 
Integer limit, final Integer offset) throws IOException {
-
+    public List<StreamingConfig> getStreamingConfigs(final String table, final 
String project, final Integer limit, final Integer offset) throws IOException {
+        aclEvaluate.checkProjectWritePermission(project);
         List<StreamingConfig> streamingConfigs;
         streamingConfigs = listAllStreamingConfigs(table);
 
@@ -65,7 +66,8 @@ public class StreamingService extends BasicService {
         return streamingConfigs.subList(offset, offset + limit);
     }
 
-    public StreamingConfig createStreamingConfig(StreamingConfig config) 
throws IOException {
+    public StreamingConfig createStreamingConfig(StreamingConfig config, 
String project) throws IOException {
+        aclEvaluate.checkProjectWritePermission(project);
         Message msg = MsgPicker.getMsg();
 
         if (getStreamingManager().getStreamingConfig(config.getName()) != 
null) {
@@ -75,13 +77,13 @@ public class StreamingService extends BasicService {
         return streamingConfig;
     }
 
-    //    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN + " or 
hasPermission(#desc, 'ADMINISTRATION') or hasPermission(#desc, 'MANAGEMENT')")
-    public StreamingConfig updateStreamingConfig(StreamingConfig config) 
throws IOException {
+    public StreamingConfig updateStreamingConfig(StreamingConfig config, 
String project) throws IOException {
+        aclEvaluate.checkProjectWritePermission(project);
         return getStreamingManager().updateStreamingConfig(config);
     }
 
-    //    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN + " or 
hasPermission(#desc, 'ADMINISTRATION') or hasPermission(#desc, 'MANAGEMENT')")
-    public void dropStreamingConfig(StreamingConfig config) throws IOException 
{
+    public void dropStreamingConfig(StreamingConfig config, String project) 
throws IOException {
+        aclEvaluate.checkProjectWritePermission(project);
         getStreamingManager().removeStreamingConfig(config);
     }
 

Reply via email to