Repository: zeppelin Updated Branches: refs/heads/branch-0.8 a1de33298 -> 3ee7c192a
ZEPPELIN-3570. Fix for doing user search for LDAPRealm To enable user search for LdapRealm. Bug Fix https://issues.apache.org/jira/browse/ZEPPELIN-3570 For the below config ``` [main] ldapRealm = org.apache.zeppelin.realm.LdapRealm ldapRealm.userDnTemplate = cn={0},ou=Users,dc=company,dc=com ldapRealm.contextFactory.url = ldap://<ldap-server-host>:389 ldapRealm.contextFactory.authenticationMechanism = SIMPLE ldapRealm.searchBase = dc=company,dc=com ldapRealm.userSearchBase = dc=company,dc=com ldapRealm.groupSearchBase = dc=company,dc=com ldapRealm.userSearchAttributeName = uid sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager securityManager.sessionManager = $sessionManager securityManager.sessionManager.globalSessionTimeout = 86400000 shiro.loginUrl = /api/login [urls] /api/version = anon /** = authc ``` user search in notebook/interpreter should work for partial string. Author: Supreeth Sharma <ssharma@HW11607.local> Closes #3045 from ssharma555/ZEPPELIN-3570 and squashes the following commits: 6a5a38e67 [Supreeth Sharma] ZEPPELIN-3570. Fix for doing user search for LDAPRealm Change-Id: I46fd67b44f2632c430a0d2b9c7545a30974cc3a5 (cherry picked from commit 36f7d3da7af273a4458905727bfeda6473b16be9) Signed-off-by: Prabhjyot Singh <prabhjyotsi...@gmail.com> # Conflicts: # zeppelin-server/src/main/java/org/apache/zeppelin/realm/ActiveDirectoryGroupRealm.java # zeppelin-server/src/main/java/org/apache/zeppelin/rest/SecurityRestApi.java Project: http://git-wip-us.apache.org/repos/asf/zeppelin/repo Commit: http://git-wip-us.apache.org/repos/asf/zeppelin/commit/3ee7c192 Tree: http://git-wip-us.apache.org/repos/asf/zeppelin/tree/3ee7c192 Diff: http://git-wip-us.apache.org/repos/asf/zeppelin/diff/3ee7c192 Branch: refs/heads/branch-0.8 Commit: 3ee7c192afc8b04bf771c8744d3f092a2325437d Parents: a1de332 Author: Supreeth Sharma <ssharma@HW11607.local> Authored: Fri Jun 29 15:35:48 2018 +0530 Committer: Prabhjyot Singh <prabhjyotsi...@gmail.com> Committed: Thu Jul 5 12:34:35 2018 +0530 ---------------------------------------------------------------------- .../realm/ActiveDirectoryGroupRealm.java | 39 ++++++++++---------- .../org/apache/zeppelin/rest/GetUserList.java | 13 ++++--- .../apache/zeppelin/rest/SecurityRestApi.java | 11 ++++-- 3 files changed, 34 insertions(+), 29 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/zeppelin/blob/3ee7c192/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 79e5a66..bad501d 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 @@ -16,7 +16,23 @@ */ package org.apache.zeppelin.realm; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import javax.naming.NamingEnumeration; +import javax.naming.NamingException; +import javax.naming.directory.Attribute; +import javax.naming.directory.Attributes; +import javax.naming.directory.SearchControls; +import javax.naming.directory.SearchResult; +import javax.naming.ldap.LdapContext; import org.apache.commons.lang.StringUtils; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationInfo; @@ -34,24 +50,6 @@ import org.apache.shiro.subject.PrincipalCollection; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.naming.NamingEnumeration; -import javax.naming.NamingException; -import javax.naming.directory.Attribute; -import javax.naming.directory.Attributes; -import javax.naming.directory.SearchControls; -import javax.naming.directory.SearchResult; -import javax.naming.ldap.LdapContext; - /** * A {@link org.apache.shiro.realm.Realm} that authenticates with an active directory LDAP @@ -256,12 +254,13 @@ public class ActiveDirectoryGroupRealm extends AbstractLdapRealm { return new SimpleAuthorizationInfo(roleNames); } - public List<String> searchForUserName(String containString, LdapContext ldapContext) throws - NamingException { + public List<String> searchForUserName(String containString, LdapContext ldapContext, + int numUsersToFetch) throws NamingException { List<String> userNameList = new ArrayList<>(); SearchControls searchCtls = new SearchControls(); searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE); + searchCtls.setCountLimit(numUsersToFetch); String searchFilter = "(&(objectClass=*)(userPrincipalName=*" + containString + "*))"; Object[] searchArguments = new Object[]{containString}; http://git-wip-us.apache.org/repos/asf/zeppelin/blob/3ee7c192/zeppelin-server/src/main/java/org/apache/zeppelin/rest/GetUserList.java ---------------------------------------------------------------------- diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/GetUserList.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/GetUserList.java index 954ee1a..5876de2 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/GetUserList.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/GetUserList.java @@ -90,7 +90,7 @@ public class GetUserList { /** * function to extract users from LDAP */ - public List<String> getUserList(JndiLdapRealm r, String searchText) { + public List<String> getUserList(JndiLdapRealm r, String searchText, int numUsersToFetch) { List<String> userList = new ArrayList<>(); String userDnTemplate = r.getUserDnTemplate(); String userDn[] = userDnTemplate.split(",", 2); @@ -100,6 +100,7 @@ public class GetUserList { try { LdapContext ctx = CF.getSystemLdapContext(); SearchControls constraints = new SearchControls(); + constraints.setCountLimit(numUsersToFetch); constraints.setSearchScope(SearchControls.SUBTREE_SCOPE); String[] attrIDs = {userDnPrefix}; constraints.setReturningAttributes(attrIDs); @@ -122,7 +123,7 @@ public class GetUserList { /** * function to extract users from Zeppelin LdapRealm */ - public List<String> getUserList(LdapRealm r, String searchText) { + public List<String> getUserList(LdapRealm r, String searchText, int numUsersToFetch) { List<String> userList = new ArrayList<>(); if (LOG.isDebugEnabled()) { LOG.debug("SearchText: " + searchText); @@ -135,11 +136,12 @@ public class GetUserList { LdapContext ctx = CF.getSystemLdapContext(); SearchControls constraints = new SearchControls(); constraints.setSearchScope(SearchControls.SUBTREE_SCOPE); + constraints.setCountLimit(numUsersToFetch); String[] attrIDs = {userAttribute}; constraints.setReturningAttributes(attrIDs); NamingEnumeration result = ctx.search(userSearchRealm, "(&(objectclass=" + userObjectClass + ")(" - + userAttribute + "=" + searchText + "))", constraints); + + userAttribute + "=*" + searchText + "*))", constraints); while (result.hasMore()) { Attributes attrs = ((SearchResult) result.next()).getAttributes(); if (attrs.get(userAttribute) != null) { @@ -186,11 +188,12 @@ public class GetUserList { } - public List<String> getUserList(ActiveDirectoryGroupRealm r, String searchText) { + public List<String> getUserList(ActiveDirectoryGroupRealm r, String searchText, + int numUsersToFetch) { List<String> userList = new ArrayList<>(); try { LdapContext ctx = r.getLdapContextFactory().getSystemLdapContext(); - userList = r.searchForUserName(searchText, ctx); + userList = r.searchForUserName(searchText, ctx, numUsersToFetch); } catch (Exception e) { LOG.error("Error retrieving User list from ActiveDirectory Realm", e); } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/3ee7c192/zeppelin-server/src/main/java/org/apache/zeppelin/rest/SecurityRestApi.java ---------------------------------------------------------------------- diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/SecurityRestApi.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/SecurityRestApi.java index 2255c1a..484bccb 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/SecurityRestApi.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/SecurityRestApi.java @@ -99,6 +99,7 @@ public class SecurityRestApi { @Path("userlist/{searchText}") public Response getUserList(@PathParam("searchText") final String searchText) { + final int numUsersToFetch = 5; List<String> usersList = new ArrayList<>(); List<String> rolesList = new ArrayList<>(); try { @@ -115,13 +116,15 @@ public class SecurityRestApi { usersList.addAll(getUserListObj.getUserList((IniRealm) realm)); rolesList.addAll(getUserListObj.getRolesList((IniRealm) realm)); } else if (name.equals("org.apache.zeppelin.realm.LdapGroupRealm")) { - usersList.addAll(getUserListObj.getUserList((JndiLdapRealm) realm, searchText)); + usersList.addAll(getUserListObj.getUserList((JndiLdapRealm) realm, searchText, + numUsersToFetch)); } else if (name.equals("org.apache.zeppelin.realm.LdapRealm")) { - usersList.addAll(getUserListObj.getUserList((LdapRealm) realm, searchText)); + usersList.addAll(getUserListObj.getUserList((LdapRealm) realm, searchText, + numUsersToFetch)); rolesList.addAll(getUserListObj.getRolesList((LdapRealm) realm)); } else if (name.equals("org.apache.zeppelin.realm.ActiveDirectoryGroupRealm")) { usersList.addAll(getUserListObj.getUserList((ActiveDirectoryGroupRealm) realm, - searchText)); + searchText, numUsersToFetch)); } else if (name.equals("org.apache.shiro.realm.jdbc.JdbcRealm")) { usersList.addAll(getUserListObj.getUserList((JdbcRealm) realm)); } @@ -151,7 +154,7 @@ public class SecurityRestApi { autoSuggestUserList.add(user); maxLength++; } - if (maxLength == 5) { + if (maxLength == numUsersToFetch) { break; } }