一:认证预授权
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
异常。