Permissions 让activeMQ的用户拥有一个名为用户的队列';姓名

Permissions 让activeMQ的用户拥有一个名为用户的队列';姓名,permissions,queue,activemq,jaas,Permissions,Queue,Activemq,Jaas,在我的应用程序中,用户可以自由创建一个帐户,它需要拥有一个队列(或主题)来在它们之间通信2个后端进程。我不希望每次有人创建帐户时都必须修改activemq的配置。我已经创建了一个jaasAuthenticationPlugin,它运行良好。以下是我的activemq.xml文件的相关部分: <plugins> <!-- 'activemq-domain' defined in conf/login.conf --> <jaasAuthenticationPl

在我的应用程序中,用户可以自由创建一个帐户,它需要拥有一个队列(或主题)来在它们之间通信2个后端进程。我不希望每次有人创建帐户时都必须修改
activemq
的配置。我已经创建了一个
jaasAuthenticationPlugin
,它运行良好。以下是我的
activemq.xml
文件的相关部分:

<plugins>
  <!-- 'activemq-domain' defined in conf/login.conf -->
  <jaasAuthenticationPlugin configuration="activemq-domain" />

  <authorizationPlugin>
    <map>
      <authorizationMap>
        <authorizationEntries>
          <authorizationEntry queue="foobarQueue"
              write="foobarGroup"
              read="foobarGroup"
              admin="foobarGroup"
          />
        </authorizationEntries>
      </authorizationMap>
    </map>
  </authorizationPlugin>
</plugins>

或者我应该编写一些JAAS授权类来实现这一点吗?

最后,我编写了一个类来处理授权部分。这有点困难,因为文档很难找到,而且我找不到任何好的例子。挖掘默认
ldaAuthorizationMap
的源代码是关键。不管怎样,任何感兴趣的人的来源:

package com.example.activemq;
导入org.apache.activemq.AdvisorySupport;
导入org.apache.activemq.command.ActiveMQDestination;
导入org.apache.activemq.jaas.GroupPrincipal;
导入org.apache.activemq.security.AuthorizationMap;
导入org.apache.commons.logging.Log;
导入org.apache.commons.logging.LogFactory;
导入java.util.HashSet;
导入java.util.Set;
公共类OwnedUserQueueAuthorizator实现AuthorizationMap{
私有静态最终日志=
getLog(OwnedUserQueueAuthorizator.class);
私有布尔调试=false;
//目的地将是用户的名称,我们应该返回该名称
//具有用户名的组具有对的读、写和管理权限
//名称与用户名相同的主题/队列
//对于临时目的地,如果返回null,则每个人都有
//允许。
公共集getTempDestinationAdminACLs(){
返回null;
}
公共集getTempDestinationReadACLs(){
返回null;
}
公共集GetTempDestinationWriteAlls(){
返回null;
}
//用于永久性目的地
公共设置GetAdminACL(ActiveMQDestination){
如果(调试){
log.debug(“getAdminACLs:+destination.getPhysicalName());
}
返回getacl(目的地);
}
公共设置GetReadACL(ActiveMQDestination){
如果(调试){
log.debug(“getReadACLs:+destination.getPhysicalName());
}
返回getacl(目的地);
}
公共集GetWriteALS(ActiveMQDestination){
如果(调试){
log.debug(“GetWriteCals:+destination.getPhysicalName());
}
返回getacl(目的地);
}
私有设置getACL(ActiveMQDestination){
设定结果;
if(AdvisorySupport.isAdvisoryTopic(目的地)){
结果=getACLsForAdvisory();
}否则{
结果=新的HashSet();
//目的地应该是UUID或UUID之类的东西。随便什么。。。,
//因此,我们必须只添加第一个组件作为组主体
结果.添加(新的GroupPrincipal)(
destination.GetDestinationPath()[0])
);
}
如果(调试){
字符串s=“”;
对于(GroupPrincipal gp:result){
s+=”,“+gp.getName();
}
log.debug(“groupPrincipals:”+“[”+s.substring(2)+“]”);
}
返回结果;
}
私有集getACLsForAdvisory(){
Set result=new HashSet();
集团负责人g=新的集团负责人(“咨询”);
结果:添加(g);
返回结果;
}
//性质
// -------------------------------------------------------------------------
//如果activemq.xml中的定义有
// 
//定义后,它们将调用此.setFoo($value),因此,即使这些get/set
//方法不是从这里调用的,它们是真正需要的。
公共void setDebug(字符串调试){
this.debug=“true”。equalsIgnoreCase(调试);
}
公共字符串getDebug(){
返回字符串.valueOf(调试);
}
}
conf/activemq.xml
文件:

<plugins>
  <!-- 'activemq-domain' defined in conf/login.conf -->
  <jaasAuthenticationPlugin configuration="activemq-domain" />

  <authorizationPlugin>
    <map>
      <authorizationMap>
        <authorizationEntries>
          <authorizationEntry queue="foobarQueue"
              write="foobarGroup"
              read="foobarGroup"
              admin="foobarGroup"
          />
        </authorizationEntries>
      </authorizationMap>
    </map>
  </authorizationPlugin>
</plugins>

...
...
...
...

最后,我编写了一个类来处理授权部分。这有点困难,因为文档很难找到,而且我找不到任何好的例子。挖掘默认
ldaAuthorizationMap
的源代码是关键。不管怎样,任何感兴趣的人的来源:

package com.example.activemq;
导入org.apache.activemq.AdvisorySupport;
导入org.apache.activemq.command.ActiveMQDestination;
导入org.apache.activemq.jaas.GroupPrincipal;
导入org.apache.activemq.security.AuthorizationMap;
导入org.apache.commons.logging.Log;
导入org.apache.commons.logging.LogFactory;
导入java.util.HashSet;
导入java.util.Set;
公共类OwnedUserQueueAuthorizator实现AuthorizationMap{
私有静态最终日志=
getLog(OwnedUserQueueAuthorizator.class);
私有布尔调试=false;
//目的地将是用户的名称,我们应该返回该名称
//具有用户名的组具有对的读、写和管理权限
//名称与用户名相同的主题/队列
//对于临时目的地,如果返回null,则每个人都有
//允许。
公共集getTempDestinationAdminACLs(){
返回null;
}
公共集getTempDesti