目录
在使用ActiveMQ的时候,一般会对其分配用户和角色来做基本的权限验证,本博文选择自带的JAAS Plugin来完成。本文中ActiveMQ版本选择5.16.0
在LINUX上下载解压完ActiveMQ之后进入到conf目录下,其中有四个文件需要特别关注:
- login.config - 登录配置
- users.properties - 用户密码配置
- groups.properties - 用户组配置
- activemq.xml - ActiveMQ实例配置
login.config
activemq {
org.apache.activemq.jaas.PropertiesLoginModule required
org.apache.activemq.jaas.properties.user="users.properties"
org.apache.activemq.jaas.properties.group="groups.properties"
reload=true;
};
在没有设置java.security.auth.login.config属性时,会默认读取这个文件作为配置;可以看到该文件中,先是定义了一个节点名activemq,第二行表示使用的是PropertiesLoginModule来获取认证信息(其他的方式请参考官网),顾名思义就是从配置文件中读取,所以下面就配置了使用users.properties文件作为用户密码配置,使用groups.properties文件作为用户组配置。默认在当前文件同一目录中查找这两个文件。reload=true,表示可以在运行过程中更改users.properties,groups.properties文件内容,并动态刷新;不要忘了最后的 ";"。
users.properties
## username = password
admin=admin
wuser=wuser
ruser=ruser
在该文件中定义用户,格式:用户名=密码;
groups.properties
## rolename = username1,username2
admins=admin
writes=wuser
reads=ruser
在该文件中定义角色,格式:角色名=用户1,用户2...
activemq.xml
<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>
<plugins>
<!-- use JAAS to authenticate using the login.config file on the classpath to configure JAAS -->
<jaasAuthenticationPlugin configuration="activemq" />
<!-- lets configure a destination based authorization mechanism -->
<authorizationPlugin>
<map>
<authorizationMap>
<authorizationEntries>
<authorizationEntry topic=">" read="reads,writes" write="writes" admin="writes,admins" />
<authorizationEntry queue=">" read="reads,writes" write="writes" admin="writes,admins" />
<authorizationEntry topic="ActiveMQ.Advisory.>" read="reads,writes,admins" write="reads,writes,admins" admin="reads,writes,admins"/>
<authorizationEntry queue="ActiveMQ.Advisory.>" read="reads,writes,admins" write="reads,writes,admins" admin="reads,writes,admins"/>
</authorizationEntries>
</authorizationMap>
</map>
</authorizationPlugin>
</plugins>
主要是plugins节点,将其放置在persistenceAdapter节点下面,用于配置权限映射。
其中jaasAuthenticationPlugin的configuration属性必须要在login.config文件中存在,上面介绍login.config文件时,定义了一个activemq的节点,所以此处同样需要设置为activemq。
下面的authorizationEntry节点中
queue/topic
代表权限是作用在queue还是topic上,其值是一个通配符表达式,通配符表达式如下,用于匹配queue/topic的名字。
. | 分隔符;分隔名字,*,> |
* | 匹配任何字符 |
> | 任何字符直到末尾 |
例如:
仅单个">" 和单个"*"都表示匹配全部
"PREFIX.>"或"PREFIX.*"都表示以PREFIX开头的中间以"."分隔;可以匹配: PREFIX , PREFIX.1 , PREFIX.1.2 ;无法匹配: PREFIX1
"PREFIX.*.SUFFIX"表示以PREFIX开头,以SUFFIX结尾;可以匹配:PREFIX.1.SUFFIX;无法匹配:PREFIX.1.2.SUFFIX,PREFIX.1.SUFFIX.2
注意,如果要使用">",那么一定要将其放在表达式的最后。具体信息可以访问官网。
read/write/admin
属性 | 描述 |
read | 查看和消费目的地数据 |
write | 往目的地发送数据 |
admin | 创建目的地 |
read/write/admin 其值是角色名,多个使用","分隔,角色名在groups.properties文件中配置。注意:如果目的地还没创建出来的话,拥有write权限的角色是无法往该目的地发送数据的。
以上,就是ActiveMQ的权限验证配置。如果是配置ActiveMQ WEB端的权限,则需要在jetty.xml 和 jetty-realm.xml中进行配置,这里就不再赘述了。