Skip to content

Commit d9d86c7

Browse files
authored
Merge pull request #10 from scholzj/add-support-for-super-users
Add support for super.users
2 parents 6198d4f + 0e76f24 commit d9d86c7

File tree

3 files changed

+24
-1
lines changed

3 files changed

+24
-1
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ The plugin supports the following properties:
3131
| `opa.authorizer.cache.initial.capacity` | `5000` | `5000` | Initial decision cache size. |
3232
| `opa.authorizer.cache.maximum.size` | `50000` | `50000` | Max decision cache size. |
3333
| `opa.authorizer.cache.expire.after.seconds` | `3600` | `3600` | Decision cache expiry in seconds. |
34+
| `super.users` | `User:alice;User:bob` | `` | Super users which are always allowed. |
3435

3536
## Usage
3637

src/main/scala/com/bisnode/kafka/authorization/OpaAuthorizer.scala

+6-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import java.util.concurrent.{Callable, ExecutionException, TimeUnit}
1111
import com.fasterxml.jackson.databind.ObjectMapper
1212
import com.fasterxml.jackson.module.scala.{DefaultScalaModule, ScalaObjectMapper}
1313
import com.google.common.annotations.VisibleForTesting
14-
import com.google.common.base.Throwables
1514
import com.google.common.cache.{Cache, CacheBuilder}
1615
import com.typesafe.scalalogging.LazyLogging
1716
import kafka.network.RequestChannel
@@ -26,6 +25,7 @@ class OpaAuthorizer extends Authorizer with LazyLogging {
2625
private var config: Map[String, String] = Map.empty
2726
private lazy val opaUrl = new URL(config("opa.authorizer.url")).toURI
2827
private lazy val allowOnError = config.getOrElse("opa.authorizer.allow.on.error", "false").toBoolean
28+
private lazy val superUsers = config.getOrElse("super.users", "").split(";").toList
2929

3030
private lazy val cache = CacheBuilder.newBuilder
3131
.initialCapacity(config.getOrElse("opa.authorizer.cache.initial.capacity", "5000").toInt)
@@ -35,6 +35,11 @@ class OpaAuthorizer extends Authorizer with LazyLogging {
3535
.asInstanceOf[Cache[Request, Boolean]]
3636

3737
override def authorize(session: RequestChannel.Session, operation: Operation, resource: Resource): Boolean = {
38+
if (superUsers.contains(session.principal.toString)) {
39+
logger.trace(s"User ${session.principal} is super user")
40+
return true
41+
}
42+
3843
val request = Request(Input(session, operation, resource))
3944
try cache.get(request, new AllowCallable(request, opaUrl, allowOnError))
4045
catch {

src/test/scala/com/bisnode/kafka/authorization/OpaAuthorizerSpec.scala

+17
Original file line numberDiff line numberDiff line change
@@ -108,11 +108,28 @@ class OpaAuthorizerSpec extends FlatSpec with Matchers with PrivateMethodTester
108108
opaAuthorizer.getCache.size should be (0)
109109
}
110110

111+
"OpaAuthorizer" should "authorize super users without checking with OPA" in {
112+
val opaAuthorizer = setupAuthorizer(opaUrl)
113+
114+
val resource = Resource(Topic, "alice-topic", PatternType.LITERAL)
115+
val operation = Write
116+
117+
val session1 = Session(new KafkaPrincipal("User", "CN=my-user"), InetAddress.getLoopbackAddress)
118+
opaAuthorizer.authorize(session1, operation, resource) should be (true)
119+
120+
val session2 = Session(new KafkaPrincipal("User", "CN=my-user2,O=my-org"), InetAddress.getLoopbackAddress)
121+
opaAuthorizer.authorize(session2, operation, resource) should be (true)
122+
123+
val session3 = Session(new KafkaPrincipal("User", "CN=my-user3"), InetAddress.getLoopbackAddress)
124+
opaAuthorizer.authorize(session3, operation, resource) should be (false)
125+
}
126+
111127
def setupAuthorizer(url: String = opaUrl): OpaAuthorizer = {
112128
val opaAuthorizer = new OpaAuthorizer()
113129
val config = new java.util.HashMap[String, String]
114130
config.put("opa.authorizer.url", url)
115131
config.put("opa.authorizer.allow.on.error", "false")
132+
config.put("super.users", "User:CN=my-user;User:CN=my-user2,O=my-org")
116133
opaAuthorizer.configure(config)
117134
opaAuthorizer
118135
}

0 commit comments

Comments
 (0)