> On Aug. 17, 2018, 8:18 p.m., Na Li wrote:
> > sentry-service/sentry-service-server/src/main/java/org/apache/sentry/provider/db/generic/service/persistent/DelegateSentryStore.java
> > Lines 255 (patched)
> > <https://reviews.apache.org/r/64661/diff/10/?file=2074734#file2074734line256>
> >
> >     1) I believe that when kafka calls 
> >     
> >     the groups is a list with only one member, which is "null".
> >     
> >     1.1) the group name is null in SentryGenericServiceClientDefaultImpl
> >       @Override
> >       public Set<TSentryRole> listAllRoles(String requestorUserName, String 
> > component)
> >         throws SentryUserException {
> >         return listRolesByGroupName(requestorUserName, null, component);
> >       }
> >       
> >      1.2) the group name of "null" is in request to generic service
> >       
> >       public Set<TSentryRole> listRolesByGroupName(
> >         String requestorUserName,
> >         String groupName,
> >         String component)
> >         throws SentryUserException {
> >         TListSentryRolesRequest request = new TListSentryRolesRequest();
> >         
> > request.setProtocol_version(sentry_common_serviceConstants.TSENTRY_SERVICE_V2);
> >         request.setRequestorUserName(requestorUserName);
> >         request.setGroupName(groupName);
> >         request.setComponent(component);
> >         TListSentryRolesResponse response;
> >         try {
> >           response = client.list_sentry_roles_by_group(request);
> >           Status.throwIfNotOk(response.getStatus());
> >           return response.getRoles();
> >         } catch (TException e) {
> >           throw new SentryUserException(THRIFT_EXCEPTION_MESSAGE, e);
> >         }
> >       }  
> >     
> >     1.3) groups contains "null" when calling 
> > DelegateSentryStore.getRolesByGroups().
> >     
> >       public TListSentryRolesResponse list_sentry_roles_by_group(
> >           final TListSentryRolesRequest request) throws TException {
> >         Response<Set<TSentryRole>> respose = requestHandle(new 
> > RequestHandler<Set<TSentryRole>>() {
> >           @Override
> >           public Response<Set<TSentryRole>> handle() throws Exception {
> >             validateClientVersion(request.getProtocol_version());
> >             Set<String> groups = getRequestorGroups(conf, 
> > request.getRequestorUserName());
> >             if 
> > (!AccessConstants.ALL.equalsIgnoreCase(request.getGroupName())) {
> >               boolean admin = inAdminGroups(groups);
> >               //Only admin users can list all roles in the system ( 
> > groupname = null)
> >               //Non admin users are only allowed to list only groups which 
> > they belong to
> >               if(!admin && (request.getGroupName() == null || 
> > !groups.contains(request.getGroupName()))) {
> >                 throw new SentryAccessDeniedException(ACCESS_DENIAL_MESSAGE 
> > + request.getRequestorUserName());
> >               }
> >               groups.clear();
> >               groups.add(request.getGroupName());
> >             }
> >             Set<String> roleNames = 
> > store.getRolesByGroups(request.getComponent(), groups);
> >     
> >     
> >     2) This implementation using SentryStore.getRolesForGroups() does not 
> > have groups contains a single element of "null" gracefully. That is why I 
> > am really worried about the test you have done for this update.
> >     
> >       public Set<MSentryRole> getRolesForGroups(PersistenceManager pm, 
> > Set<String> groups) {
> >         Set<MSentryRole> result = Sets.newHashSet();
> >         if (groups != null) {
> >           Query query = pm.newQuery(MSentryGroup.class);
> >           query.addExtension(LOAD_RESULTS_AT_COMMIT, "false");
> >           query.setFilter(":p1.contains(this.groupName)");
> >           List<MSentryGroup> sentryGroups = (List) 
> > query.execute(groups.toArray());
> >           if (sentryGroups != null) {
> >             for (MSentryGroup sentryGroup : sentryGroups) {
> >               result.addAll(sentryGroup.getRoles());
> >             }
> >           }
> >         }
> >         return result;
> >       }
> >       
> >       3) You should check if there is a member of null in groups and handle 
> > it properly, and have testing case for that scenario.

Still going through your comments. But I did add the null check under 
getRolesByGroups method. See below:

if(groups.contains(null)) {
            true)) {
      roles = delegate.getAllRoleNames();
      roles.add(tSentryRole.getRoleName());
    } else {
      roles = delegate.getRoleNamesForGroups(groups);
    }
    }


- Arjun


-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviews.apache.org/r/64661/#review207538
-----------------------------------------------------------


On Aug. 17, 2018, 7:01 p.m., Arjun Mishra wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviews.apache.org/r/64661/
> -----------------------------------------------------------
> 
> (Updated Aug. 17, 2018, 7:01 p.m.)
> 
> 
> Review request for sentry, kalyan kumar kalvagadda, Na Li, Steve Moist, and 
> Sergio Pena.
> 
> 
> Bugs: SENTRY-1944
>     https://issues.apache.org/jira/browse/SENTRY-1944
> 
> 
> Repository: sentry
> 
> 
> Description
> -------
> 
> When Solr is using Sentry server for authorization, it issues a lot of calls 
> to getGroupsByRoles() function in DelegateSentryStore.
> 
> This function isn't very efficient - it walks over each role in the set, 
> obtains role by name, get groups for each role, and collects all group names 
> into a set.
> 
> It may be possible to optimize it.
> 
> Also, in SentryGenericPolicyProcessor class method 
> list_sentry_roles_by_group() would make N transactions to build the roles to 
> set of groups map. Instead, make it to a single transaction. This will 
> significantly speed up operation
> 
> Attach one or more files to this issue
> 
> 
> Diffs
> -----
> 
>   
> sentry-service/sentry-service-server/src/main/java/org/apache/sentry/api/generic/thrift/SentryGenericPolicyProcessor.java
>  1cc4b1b37 
>   
> sentry-service/sentry-service-server/src/main/java/org/apache/sentry/provider/db/generic/service/persistent/DelegateSentryStore.java
>  3026a6225 
>   
> sentry-service/sentry-service-server/src/main/java/org/apache/sentry/provider/db/generic/service/persistent/SentryStoreLayer.java
>  eec2757d3 
>   
> sentry-service/sentry-service-server/src/test/java/org/apache/sentry/api/generic/thrift/TestSentryGenericPolicyProcessor.java
>  4c207e9b4 
>   
> sentry-service/sentry-service-server/src/test/java/org/apache/sentry/provider/db/generic/service/persistent/TestDelegateSentryStore.java
>  69d16238f 
> 
> 
> Diff: https://reviews.apache.org/r/64661/diff/10/
> 
> 
> Testing
> -------
> 
> mvn -f sentry-provider/sentry-provider-db/pom.xml test
> 
> 
> Thanks,
> 
> Arjun Mishra
> 
>

Reply via email to