Repository: zeppelin
Updated Branches:
  refs/heads/master 380cfbfe3 -> b02707975


[ZEPPELIN-2640] Roles are not getting honored from shiro_ini for setting 
permissions in Zeppelin notebook

### What is this PR for?
Roles are not getting honored from shiro_ini for setting permissions in 
Zeppelin notebook when securityManager.realm is set to $activeDirectoryRealm

### What type of PR is it?
[Bug Fix]

### Todos
* [x] - Create JIRA

### What is the Jira issue?
* [ZEPPELIN-2640](https://issues.apache.org/jira/browse/ZEPPELIN-2640)

### How should this be tested?
Use the below-attached shiro.ini, the thing which is different is 
`securityManager.realm = $activeDirectoryRealm`. When this is used, Zeppelin 
does not set the roles that were assigned to that particular user.

```
[main]
activeDirectoryRealm = org.apache.zeppelin.realm.ActiveDirectoryGroupRealm
activeDirectoryRealm.systemUsername = 
CN=Administrator,CN=Users,DC=COMPANY,DC=COM
activeDirectoryRealm.systemPassword = Password1!
activeDirectoryRealm.searchBase = CN=Users,DC=COMPANY,DC=COM
activeDirectoryRealm.url = ldap://ad-nano.mydomain.com:389
activeDirectoryRealm.groupRolesMap = 
"CN=zeppelin,OU=groups,DC=COMPANY,DC=COM":"admin","CN=finance,OU=groups,DC=COMPANY,DC=COM":"finance"
activeDirectoryRealm.authorizationCachingEnabled = true

securityManager.realm = $activeDirectoryRealm

sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager
cacheManager = org.apache.shiro.cache.MemoryConstrainedCacheManager
securityManager.cacheManager = $cacheManager
securityManager.sessionManager = $sessionManager
securityManager.sessionManager.globalSessionTimeout = 86400000
shiro.loginUrl = /api/login

[urls]
/api/version = anon
/** = authc
```

So, before this PR if you `tail -f 
zeppelin-<username>-<machine-name>.local.log` in the log you will see this line
` WARN [2017-06-12 12:42:06,620] ({qtp226744878-19} 
LoginRestApi.java[postLogin]:119) - 
{"status":"OK","message":"","body":{"principal":"zeppelin","ticket":"4b1e513f-7736-4474-b2d6-259ff3d39f91","roles":"[]"}}`

And after applying this PR you will be able to see the role that got assigned 
to this user i.e.
` WARN [2017-06-12 12:42:06,620] ({qtp226744878-19} 
LoginRestApi.java[postLogin]:119) - 
{"status":"OK","message":"","body":{"principal":"zeppelin","ticket":"4b1e513f-7736-4474-b2d6-259ff3d39f91","roles":"[admin]"}}`

### Screenshots (if appropriate)
N/A

### Questions:
* Does the licenses files need update? N/A
* Is there breaking changes for older versions? N/A
* Does this needs documentation? N/A

Author: Prabhjyot Singh <prabhjyotsi...@gmail.com>

Closes #2405 from prabhjyotsingh/bug/securityManagerActiveDirectory and 
squashes the following commits:

9439ac8a7 [Prabhjyot Singh] fix when securityManager.realm is set to 
$activeDirectoryRealm


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

Branch: refs/heads/master
Commit: b027079758c86ab9abe407c42e1968c6646288e6
Parents: 380cfbf
Author: Prabhjyot Singh <prabhjyotsi...@gmail.com>
Authored: Mon Jun 12 12:39:02 2017 +0530
Committer: Prabhjyot Singh <prabhjyotsi...@gmail.com>
Committed: Thu Jun 15 10:50:41 2017 +0530

----------------------------------------------------------------------
 .../apache/zeppelin/realm/ActiveDirectoryGroupRealm.java  | 10 ++++++++++
 .../java/org/apache/zeppelin/utils/SecurityUtils.java     |  4 ++++
 2 files changed, 14 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zeppelin/blob/b0270797/zeppelin-server/src/main/java/org/apache/zeppelin/realm/ActiveDirectoryGroupRealm.java
----------------------------------------------------------------------
diff --git 
a/zeppelin-server/src/main/java/org/apache/zeppelin/realm/ActiveDirectoryGroupRealm.java
 
b/zeppelin-server/src/main/java/org/apache/zeppelin/realm/ActiveDirectoryGroupRealm.java
index d40a643..4f3626c 100644
--- 
a/zeppelin-server/src/main/java/org/apache/zeppelin/realm/ActiveDirectoryGroupRealm.java
+++ 
b/zeppelin-server/src/main/java/org/apache/zeppelin/realm/ActiveDirectoryGroupRealm.java
@@ -297,6 +297,16 @@ public class ActiveDirectoryGroupRealm extends 
AbstractLdapRealm {
     return userNameList;
   }
 
+  public Map<String, String> getListRoles() {
+    Map<String, String> roles = new HashMap<>();
+    Iterator it = this.groupRolesMap.entrySet().iterator();
+    while (it.hasNext()) {
+      Map.Entry pair = (Map.Entry) it.next();
+      roles.put((String) pair.getValue(), "*");
+    }
+    return roles;
+  }
+
   private Set<String> getRoleNamesForUser(String username, LdapContext 
ldapContext)
       throws NamingException {
     Set<String> roleNames = new LinkedHashSet<>();

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/b0270797/zeppelin-server/src/main/java/org/apache/zeppelin/utils/SecurityUtils.java
----------------------------------------------------------------------
diff --git 
a/zeppelin-server/src/main/java/org/apache/zeppelin/utils/SecurityUtils.java 
b/zeppelin-server/src/main/java/org/apache/zeppelin/utils/SecurityUtils.java
index dcb5a1f..19eb980 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/utils/SecurityUtils.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/utils/SecurityUtils.java
@@ -34,6 +34,7 @@ import org.apache.shiro.subject.Subject;
 import org.apache.shiro.util.ThreadContext;
 import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
 import org.apache.zeppelin.conf.ZeppelinConfiguration;
+import org.apache.zeppelin.realm.ActiveDirectoryGroupRealm;
 import org.apache.zeppelin.realm.LdapRealm;
 import org.mortbay.log.Log;
 import org.slf4j.Logger;
@@ -133,6 +134,9 @@ public class SecurityUtils {
         } else if (name.equals("org.apache.zeppelin.realm.LdapRealm")) {
           allRoles = ((LdapRealm) realm).getListRoles();
           break;
+        } else if 
(name.equals("org.apache.zeppelin.realm.ActiveDirectoryGroupRealm")) {
+          allRoles = ((ActiveDirectoryGroupRealm) realm).getListRoles();
+          break;
         }
       }
       if (allRoles != null) {

Reply via email to