ActiveMQ 授权 - 如何从数据库中读取授权条目

ActiveMQ Authorization - How To Read Authorization Entries from Database

我正在使用自定义身份验证和授权部署 ActiveMQ。我有一个关于自定义授权映射的查询。

问题 我想从数据库中读取授权条目而不是 activemq.xml。我们不想在 activemq.xml 文件中写入我们的授权条目。我不想更改默认授权插件中提供的通配符队列名称层次结构。 我需要重写哪些代码组件?

我找到了上述问题的答案。我只需要连接我的自定义 class,这样我就可以从 activemq.xml 以外的来源加载授权条目。而且我还可以每 1 分钟重新加载一次授权,这样如果创建了新的角色或授权条目,它就会重新加载到系统中而无需重新启动。

解决方案配置

  1. 创建一个 class 该接口 AuthorizationMap。 在我的例子中,我从 DefaultAuthorizationMap.java 扩展了我的 class。我 想要类似的功能并且只想更改授权条目的输入。我的代码从数据库中读取角色。请参阅下面的 "Code-CustomAuthorizationMap" 部分。

  2. 将 CustomAuthorizationMap class 配置为 activemq.xml

    中的 bean
    <plugins>
        <jaasAuthenticationPlugin configuration="activemq"/>
    
        <authorizationPlugin>
            <map>
                <bean xmlns="" class="com.test.CustomAuthorizationMap"
            </map>
        </authorizationPlugin
    </plugins>
    
  3. 将库添加到 class路径

    a. Create the jar file. Place it in "%ActiveMQ-Home%/lib" folder. E.g. custom-authorization.jar
    b. Modify "%ActiveMQ-Home%/bin/activemq.bat".
       **Replace** 
           set ACTIVEMQ_CLASSPATH=%ACTIVEMQ_CONF%;%ACTIVEMQ_BASE%/conf;%ACTIVEMQ_HOME%/conf;%ACTIVEMQ_CLASSPATH%;
       **With**
           set ACTIVEMQ_CLASSPATH=%ACTIVEMQ_CONF%;%ACTIVEMQ_BASE%/conf;%ACTIVEMQ_HOME%/conf;%ACTIVEMQ_CLASSPATH%;%ACTIVEMQ_HOME%/lib/custom-authorization.jar;
    

代码-CustomAuthorizationMap

package com.test.authorization.map;

import java.util.ArrayList;
import java.util.List;

import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTempQueue;
import org.apache.activemq.command.ActiveMQTopic;
import org.apache.activemq.filter.DefaultDestinationMapEntry;
import org.apache.activemq.filter.DestinationMapEntry;
import org.apache.activemq.security.AuthorizationEntry;
import org.apache.activemq.security.DefaultAuthorizationMap;

public class SecGwAuthorizationMap extends DefaultAuthorizationMap {

    public SecGwAuthorizationMap() throws Exception {
        super();

        List<DestinationMapEntry> authorizationEntries = 
       loadAuthorizationEntriesFromPropFiles();

//  For information. After loading I populate 
//authorization entries like below
//          AuthorizationEntry entry = new AuthorizationEntry();
//          entry.setTopic(">");
//          entry.setAdmin("admins");
//          entry.setRead("admins");
//          entry.setWrite("admins");
//          authorizationEntries.add(entry);

//          entry = new AuthorizationEntry();
//          entry.setQueue(">");
//          entry.setAdmin("admins");
//          entry.setRead("admins");
//          entry.setWrite("admins");
//          authorizationEntries.add(entry);

//          entry= new AuthorizationEntry();
//          entry.setTopic("ActiveMQ.Advisory.>");
//          entry.setAdmin("gcabrokerusers,admins,users");
//          entry.setRead("gcabrokerusers");
//          entry.setWrite("gcabrokerusers");
//          authorizationEntries.add(entry);

//          entry = new AuthorizationEntry();
//          entry.setQueue("gcaa.test.jms.>");
//          entry.setAdmin("gcabrokerusers");
//          entry.setRead("gcabrokerusers");
//          entry.setWrite("gcabrokerusers");
//          authorizationEntries.add(entry);
            setAuthorizationEntries(authorizationEntries);
        }

    public SecGwAuthorizationMap(List<DestinationMapEntry> 
    authorizationEntries) {

        super(authorizationEntries);
        // TODO Auto-generated constructor stub
    }

 }

注意:- 下面是一个示例 roles.properties 文件,用于说明我们如何创建授权角色。

roles.properties 文件

//commentedLine      Destination     Read-ACLs    Write-ACLs    AdminAcls     Type
ActiveMQ.Advisory.>::admins,appUsr::admins,appusr::admins,appUsr::TOPIC
test.accounts.queue::appClientId::appClientId::admins::QUEUE
>::admins::admins::admins::QUEUE
>::admins::admins::admins::TOPIC