----------------------------------------------------------- This is an automatically generated e-mail. To reply, visit: https://reviews.apache.org/r/34492/#review85791 -----------------------------------------------------------
Thanks for that patch. A few comments below. Also, two common types of users are consumers and publishers. Currently, if you want to allow a user to consume from topic t in consumer group g, you have to grant (1) read permission on topic t; (2) read permission on group g; (3) describe permission on topic t; (4) describe permission on group g; (5) create permission on offset topic; (6) describe permission on offset topic. Similarly, if you want to allow a user to publish to a topic t, you need to grant (1) write permission to topic t; (2) create permission on the cluster; (3) describe permission on topic t. These are a quite a few individual permission for the admin to remember and set. I am wondering if we can grant permissions to these two types of users in a simpler way, at least through the cli. For example, for a consumer, based on the topics and the consumer group, it would be nice if the cli can grant the necessary permissions automatically, instead of having to require the admin to set each indivial permission. core/src/main/scala/kafka/security/auth/Acl.scala <https://reviews.apache.org/r/34492/#comment137600> Could we document the ZK format in the comment. core/src/main/scala/kafka/security/auth/Acl.scala <https://reviews.apache.org/r/34492/#comment137598> Currently, the convention for constants in our scala code is CamelCase (see ZkUtils). core/src/main/scala/kafka/security/auth/Acl.scala <https://reviews.apache.org/r/34492/#comment137603> aclMap.get(key).get can just be aclMap(key). core/src/main/scala/kafka/security/auth/Acl.scala <https://reviews.apache.org/r/34492/#comment137613> Instead of this, would it be better to model Acls as a class? Then, we just need Acls.fromJson and Acls.toJson. core/src/main/scala/kafka/security/auth/Acl.scala <https://reviews.apache.org/r/34492/#comment137609> Would it be better to use a case class here so that we don't have to override equals and hashcode, and perhaps toString()? core/src/main/scala/kafka/security/auth/Acl.scala <https://reviews.apache.org/r/34492/#comment137628> Hmm, not sure why we can't just implement a toJson directly. The json library is only used for decode, but not encode, right? core/src/main/scala/kafka/security/auth/Authorizer.scala <https://reviews.apache.org/r/34492/#comment137634> I am not sure if it's enough to just take KafkaConfig. KafkaConfig will only contain pre-defined properties. However, the plugin module may need some plugin specific properties that haven't been predefined. It seems that we need to take in the original properties as what we do in the client (see Configurable). core/src/main/scala/kafka/security/auth/Authorizer.scala <https://reviews.apache.org/r/34492/#comment137637> Since this is just for authorization, perhaps the semantic should be removing all acls associated with a resource? The removing of the resource itself should be done somewhere else. core/src/main/scala/kafka/security/auth/KafkaPrincipal.scala <https://reviews.apache.org/r/34492/#comment137567> So groups typically don't include ':' ? core/src/main/scala/kafka/security/auth/KafkaPrincipal.scala <https://reviews.apache.org/r/34492/#comment137565> Since userType is public constant, we want to capitalize U. core/src/main/scala/kafka/security/auth/KafkaPrincipal.scala <https://reviews.apache.org/r/34492/#comment137564> Perhaps Harsh can comment on this. Are we able to populate the principalType through an ssl or sasl connection? core/src/main/scala/kafka/security/auth/KafkaPrincipal.scala <https://reviews.apache.org/r/34492/#comment137568> Should we test for null? Also, is principal name always case insensitive? core/src/main/scala/kafka/security/auth/Operation.java <https://reviews.apache.org/r/34492/#comment137594> Currently, core is completely scala. Is there a particular reason that this and a few other new classes in core are in java? core/src/main/scala/kafka/security/auth/Resource.scala <https://reviews.apache.org/r/34492/#comment137576> Capitalize c and s. core/src/main/scala/kafka/security/auth/Resource.scala <https://reviews.apache.org/r/34492/#comment137580> Capitalize expected and allowed. Space before allowed. core/src/main/scala/kafka/server/KafkaApis.scala <https://reviews.apache.org/r/34492/#comment137738> Instead if generating the response here directly, it's probably simpler to just throw an AuthroizationException. The caller already has a generic way of generating the response on exceptions. We can do this for all requests of CLUSTER_ACTION. core/src/main/scala/kafka/server/KafkaApis.scala <https://reviews.apache.org/r/34492/#comment137739> Not sure why we need to do this for each partition. It seems that doing the authorization check once for the whole request is enough. core/src/main/scala/kafka/server/KafkaApis.scala <https://reviews.apache.org/r/34492/#comment137737> The resource should be consumer group. So, either the whole request will be authorized or not. core/src/main/scala/kafka/server/KafkaApis.scala <https://reviews.apache.org/r/34492/#comment137687> It would be good to avoid using ._1 since it's not clear what kind of data it is. To make it clear, we could do partition { case (TopicAndPartition, _) => ... } core/src/main/scala/kafka/server/KafkaApis.scala <https://reviews.apache.org/r/34492/#comment137740> space btw the two parameters passed into Resource. There are a few other places like that. core/src/main/scala/kafka/server/KafkaApis.scala <https://reviews.apache.org/r/34492/#comment137742> Using Nil here is correct. However, the usage in OffsetRequest line 117 is incorrect. Instead of passing in null, we should pass in Nil. This is not introduced in the patch, but could you fix it in this patch to make the usage consistent? core/src/main/scala/kafka/server/KafkaApis.scala <https://reviews.apache.org/r/34492/#comment137749> We should also check the user has read permission on the consumer group, right? core/src/main/scala/kafka/server/KafkaApis.scala <https://reviews.apache.org/r/34492/#comment137743> Could you do what's described in TODO? Also, it seems that we should check for the read permission on the consumer group. The KIP wiki needs to be updatd as well. core/src/main/scala/kafka/server/KafkaConfig.scala <https://reviews.apache.org/r/34492/#comment137736> This doesn't seem to be in the KIP wiki. Could you explain a bit how it will be used? core/src/main/scala/kafka/server/KafkaConfig.scala <https://reviews.apache.org/r/34492/#comment137735> We probably shouldn't introduce a separate config path for authorization. Instead of, it's simpler if authorization related properties can be specified in the same broker property file. So, we probably should do this in the same way as we do in KafkaProducer. Bascially, we pass a key/value property map to KafkaConfig. We then configure the authorizer instance by pass in the original property map. We can make "authorizer.class.name" of type class and make it implement Configurable. See ProducerConfig.METRIC_REPORTER_CLASSES_CONFIG as an example. This will also allow people to pass in the configure to Kafka server directly, instead of always assuming the configs have to be read from a file. core/src/test/scala/unit/kafka/security/auth/AclTest.scala <https://reviews.apache.org/r/34492/#comment137745> Instead of using acl.json, could we just use a local string to represent the acl value stored in ZK? core/src/test/scala/unit/kafka/security/auth/AclTest.scala <https://reviews.apache.org/r/34492/#comment137746> This is probably not needed if we turn ACL to a case class. core/src/test/scala/unit/kafka/security/auth/ResourceTest.scala <https://reviews.apache.org/r/34492/#comment137748> Hmm, interesting. Currently, topic name is actually case sensitive. - Jun Rao On May 20, 2015, 8:02 p.m., Parth Brahmbhatt wrote: > > ----------------------------------------------------------- > This is an automatically generated e-mail. To reply, visit: > https://reviews.apache.org/r/34492/ > ----------------------------------------------------------- > > (Updated May 20, 2015, 8:02 p.m.) > > > Review request for kafka. > > > Bugs: KAFKA-2210 > https://issues.apache.org/jira/browse/KAFKA-2210 > > > Repository: kafka > > > Description > ------- > > KAFKA-2210: Kafka authorizer public entities and changes to KafkaAPI and > KafkaServer to allow custom authorizer implementation. > > > Diffs > ----- > > core/src/main/scala/kafka/common/AuthorizationException.scala PRE-CREATION > core/src/main/scala/kafka/common/ErrorMapping.scala > c75c68589681b2c9d6eba2b440ce5e58cddf6370 > core/src/main/scala/kafka/security/auth/Acl.scala PRE-CREATION > core/src/main/scala/kafka/security/auth/Authorizer.scala PRE-CREATION > core/src/main/scala/kafka/security/auth/KafkaPrincipal.scala PRE-CREATION > core/src/main/scala/kafka/security/auth/Operation.java PRE-CREATION > core/src/main/scala/kafka/security/auth/PermissionType.java PRE-CREATION > core/src/main/scala/kafka/security/auth/Resource.scala PRE-CREATION > core/src/main/scala/kafka/security/auth/ResourceType.java PRE-CREATION > core/src/main/scala/kafka/server/KafkaApis.scala > 387e387998fc3a6c9cb585dab02b5f77b0381fbf > core/src/main/scala/kafka/server/KafkaConfig.scala > 9efa15ca5567b295ab412ee9eea7c03eb4cdc18b > core/src/main/scala/kafka/server/KafkaServer.scala > ea6d165d8e5c3146d2c65e8ad1a513308334bf6f > core/src/test/resources/acl.json PRE-CREATION > core/src/test/scala/unit/kafka/security/auth/AclTest.scala PRE-CREATION > core/src/test/scala/unit/kafka/security/auth/KafkaPrincipalTest.scala > PRE-CREATION > core/src/test/scala/unit/kafka/security/auth/ResourceTest.scala > PRE-CREATION > core/src/test/scala/unit/kafka/server/KafkaConfigConfigDefTest.scala > 8014a5a6c362785539f24eb03d77278434614fe6 > > Diff: https://reviews.apache.org/r/34492/diff/ > > > Testing > ------- > > > Thanks, > > Parth Brahmbhatt > >