有没有办法用Apache Apollo MQ授权目的地?
我想要的是做到这一点 1)用户可以只写一个共享主题,但限制读取到服务器/管理员。本主题是将消息发送到服务器。 2)用户可以从他们自己的私人主题中读取,但除了服务器/管理员之外,没有人可以写入它。
例如:
Topic User rights Server/Admin rights
/public Write only Read only
/user/foo ONLY the user foo may read Write only
/user/bar ONLY the user bar may read Write only
/user/<username> ONLY the <username> may read Write only
现在有趣的部分。这必须适用于动态主题。用户的名字未提前知道。
我使用自定义BrokerFilter与Apache ActiveMQ合作,但我不确定如何使用Apollo。
感谢您的帮助。
答案 0 :(得分:1)
经过大量的搔痒后,我发现了它。
在apollo.xml中:
<broker xmlns="http://activemq.apache.org/schema/activemq/apollo" security_factory="com.me.MyAuthorizationPlugin">
在com.me.MyAuthorizationPlugin中:
package com.me
import org.fusesource.hawtdispatch.DispatchQueue.QueueType
import org.apache.activemq.apollo.broker.security._
import org.apache.activemq.apollo.broker.{ Queue, Broker, VirtualHost }
import java.lang.Boolean
class MyAuthorizationPlugin extends SecurityFactory {
def install(broker: Broker) {
DefaultSecurityFactory.install(broker)
}
def install(virtual_host: VirtualHost) {
DefaultSecurityFactory.install(virtual_host)
val default_authorizer = virtual_host.authorizer
virtual_host.authorizer = new Authorizer() {
def can(ctx: SecurityContext, action: String, resource: SecuredResource): Boolean = {
println("Resource: " + resource.id + " User: " + ctx.user)
resource.resource_kind match {
case SecuredResource.TopicKind =>
val id = resource.id
println("Topic Resource: " + id + " User: " + ctx.user)
var result : Boolean = id.startsWith("user." + ctx.user) || id.startsWith("MDN." + ctx.user + ".")
println("Result: " + result)
return result
case _ =>
return default_authorizer.can(ctx, action, resource)
}
}
}
}
}
以下网址似乎非常有用,而且几乎完全匹配:
现在我只需要清理我讨厌的scala并把它放在Git中。
我正在考虑做两个测试:
如果它们几乎完全相同,我可以通过联系委员来看到将它添加到Apollo。