一:认证预授权

activemq作为主流的消息中间件,其资源及论坛还是比较多的,但是针对认证与授权都是前篇一律。在此通过阅读官方文档及实例测试详解验证与授权的配置

1、系统环境CentOs6.5,首先从官网下载activemq的安装包,解压运行即可,默认使用端口为8161(管理端口)、61616(用于创建消息与消费消息)。

2、配置过程如下

先编写conf/activemq.xml文件

<persistenceAdapter>
            <kahaDB directory="${activemq.data}/kahadb"/>
        </persistenceAdapter>

        <!-- add authentication -->

        <plugins>
                <simpleAuthenticationPlugin>
                        <users>
                                <authenticationUser username="test" password="test" groups="users,admins"/>
                        </users>
                </simpleAuthenticationPlugin>


                <!-- 通过jaas进行授权与验证 -->
                <jaasAuthenticationPlugin configuration="activemq-domain"/>

                <authorizationPlugin>
                        <map>
                                <authorizationMap>
                                        <authorizationEntries>
                                                <authorizationEntry queue=">" read="admins" write="admins" admin="admins"/>
                                                <authorizationEntry queue="TEST-QUEUE.>" read="users" write="users" admin="users, admins"/>
                                                <authorizationEntry queue="GUEST.>" read="guests" write="guests,users" admin="guests,users"/>
                                                <authorizationEntry queue="ActiveMQ.Advisory.>" read="guests, users" write="guests,users" admin="guests,users"/>
                                                <authorizationEntry topic=">" read="admins" write="admins" admin="admins"/>
                                                <authorizationEntry topic="TEST-TOPIC.>" read="users" write="users" admin="users, admins"/>
                                                <authorizationEntry topic="GUEST.>" read="guests" write="guests,users" admin="guests,users"/>
                                                <authorizationEntry topic="ActiveMQ.Advisory.>" read="guests, users" write="guests,users" admin="guests,users"/>
                                        </authorizationEntries>

                                        <tempDestinationAuthorizationEntry>
                                                <tempDestinationAuthorizationEntry read="tempDestinationAdmins" write="tempDestinationAdmins" admin="tempDestinationAdm
ins"/>
                                        </tempDestinationAuthorizationEntry>
                                </authorizationMap>
                        </map>
                </authorizationPlugin>
        </plugins>

添加在<broker>节点下添加<plugins> 节点,在节点下添加如下节点<simpleAuthenticationPlugin>、<jaasAuthenticationPlugin"/>、<authorizationPlugin>。

<simpleAuthenticationPlugin>节点通过子节点定义用户、组信息

<authenticationUser username="system" password="manager" groups="users,admins"/>

其中groups信息用于验证授权,用户信息可以从conf/credentials.properties中通过${}进行获得。

<jaasAuthenticationPlugin"/>节点通过Java Authentication Authorization Service进行用户验证及授权操作

<jaasAuthenticationPlugin configuration="activemq-domain"/>

其中configuration=“activemq-domain”中的activemq-domain要与conf/login.config中节点名称对应,内容如下

activemq-domain {
        org.apache.activemq.jaas.PropertiesLoginModule required
        org.apache.activemq.jaas.properties.user="users.properties"
        org.apache.activemq.jaas.properties.group="groups.properties"
        reload=true;
};

通过上述配置可以知道,此时用户信息及组信息是从users.properties和groups.properties文件中进行加载的,其中reload=true表示,更新用用户信息可以动态加载。
 

<authorizationPlugin>节点用于通过jaas进行用户的授权,其中mq的权限有三种

read :destination中消息的浏览及消费

write :destination中消息的创建

admin :destiantion中最高权限,任意消息的管理

用户权限配置

<authorizationEntry queue=">" read="admins" write="admins" admin="admins"/>
<authorizationEntry topic="USERS.>" read="users" write="users" admin="users"/>

 消息有两种queue和topic,其中read、write、admin用户指定用户组,其中conf/groups.properties中文件内容如下

admins=admin
users=admin,develop,sslclient
tempDestinationAdmins=system,user,sslclient,client,broker1,broker2
guests=guest

等号前时候组名,等号后是用户列表,多个用户之间用","分割。

二:持久到Mysql中

将mysql的mysql-connector-java-5.1.35.jar拷贝到activemq的lib目录下,

修改conf/activemq.xml文件,在<broker>节点外添加如下配置

<bean id="mysql-ds" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
  <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
  <property name="url" value="jdbc:mysql://127.0.0.1:3306/activemq?relaxAutoCommit=true"/>
  <property name="username" value="dzc4test"/>
  <property name="password" value="dzc4test@123"/>
  <property name="poolPreparedStatements" value="true"/>
</bean>

这里注意class属性的设置,早期版本的mq使用的org.apache.commons.dbcp.BasicDataSource,新版本的mq使用的org.apache.commons.dbcp2.BasicDataSource

更新<broker>节点中的<persistenceAdapter>信息添加如下信息

<jdbcPersistenceAdapter dataSource="#mysql-ds" />

总结:

1、 <jaasAuthenticationPlugin configuration="activemq-domain"/>优先级高于<simpleAuthenticationPlugin>,如果配置了 <jaasAuthenticationPlugin configuration="activemq-domain"/>那么用户的验证授权信息将从user.properties和group.properties文件中进行加载;如果只配置<simpleAuthenticationPlugin>那么用户的验证与授权信息直接从子节点authenticationUser中进行定义,此时用户的信息也可以存放在conf/credentials.properties文件中,通过${}进行加载即可。

2、如果配置<jaasAuthenticationPlugin configuration="activemq-domain"/>那么conf/login.config中节点名称一定要为activemq-domain,否则在发送或是接收消息时会抛出

Caused by: javax.security.auth.login.LoginException: No LoginModules configured for activemq-domain

异常。