Jms apacheapollomq中的动态目标

Jms apacheapollomq中的动态目标,jms,activemq,apollo,Jms,Activemq,Apollo,有没有一种方法可以通过Apache Apollo MQ授权目标 我想做的是让它 1) 用户只能对共享主题进行写入,但只能对服务器/管理员进行读取。本主题用于向服务器发送消息。 2) 用户可以阅读自己的私人主题,但除服务器/管理员外,任何人都不能对其进行写入 例如: Topic User rights Server/Admin rights /public Write only

有没有一种方法可以通过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
主题用户权限服务器/管理员权限
/公共只读写
/user/foo ONLY用户foo只能读写
/仅用户/bar用户栏只能读写
/用户/仅用户可以是只读的
现在来看有趣的部分。这必须适用于动态主题。用户的名字在时间之前是未知的

我使用定制的BrokerFilter与ApacheActiveMQ协作,但不确定如何使用Apollo


谢谢你的帮助。

我费了好大劲才弄明白

在apollo.xml中:

<broker xmlns="http://activemq.apache.org/schema/activemq/apollo" security_factory="com.me.MyAuthorizationPlugin">
以下URL看起来非常有用,实际上几乎是完美的匹配:

现在我只需要清理我讨厌的scala并将其放入Git

我正在考虑做两项测试:

  • 速度正是我所需要的
  • 带有username/clientID替换和+/*/?/etc的正则表达式模式匹配器此模式将从配置文件中提取
  • 如果它们几乎相同,我可能会通过联系提交人来考虑将其添加到阿波罗

    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)
                    }
                }
            }
        }
    }