安全权限有三种

read    You can browse and consume from the destinationwrite   You can send messages to the destinationadmin   You can lazily create the destination if it does not yet exist.
This allows you fine grained control over which new destinations can
be dynamically created in what part of the queue/topic hierarchy

admin是我们在写我们自己客户端程序访问activeMQ时候,如果队列/主题不存在.则admin就可指定该”角色”是否有权限建立这个队列(没错,不像weblogic的jms那样,队列/主题没有从后台建立,则客户端无法访问

第一种方式:Simple Authentication(简单的身份验证)

在conf/activemq.xml文件中加入以下内容即可(如配置了systemUsage,应该放到systemUsage前,否则出bug):

<plugins>
<!-- Configure authentication; Username, passwords and groups -->    <simpleAuthenticationPlugin>    <users>    <authenticationUser username="system" password="${activemq.password}"   groups="users,admins"/>    <authenticationUser username="user" password="${guest.password}"  groups="users"/>    <authenticationUser username="guest" password="${guest.password}" groups="guests"/>    </users>    </simpleAuthenticationPlugin>
</plugins>

引用在conf/credential.properties中配置

activemq.username=system
activemq.password=manager
guest.password=password

创建1个简单的生产者消费者

package com.tgb.activemq;import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
/*** 消息的消费者(接受者)* @author liang**/
public class JMSConsumer {private static final String USERNAME = "system";private static final String PASSWORD = "manager";private static final String BROKEURL = ActiveMQConnection.DEFAULT_BROKER_URL;//默认连接地址,一般是localhost:61616,也是在activemq.xml中配置public static void main(String[] args) {ConnectionFactory connectionFactory;//连接工厂Connection connection = null;//连接Session session;//会话 接受或者发送消息的线程Destination destination;//消息的目的地MessageConsumer messageConsumer;//消息的消费者//实例化连接工厂connectionFactory = new ActiveMQConnectionFactory(JMSConsumer.USERNAME, JMSConsumer.PASSWORD, JMSConsumer.BROKEURL);try {//通过连接工厂获取连接connection = connectionFactory.createConnection();//启动连接connection.start();//创建sessionsession = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);//创建一个连接HelloWorld的消息队列destination = session.createQueue("HelloWorld");//创建消息消费者 messageConsumer = session.createConsumer(destination);while (true) {TextMessage textMessage = (TextMessage) messageConsumer.receive(100000);if(textMessage != null){System.out.println("收到的消息:" + textMessage.getText());}else {break;}}} catch (JMSException e) {e.printStackTrace();}}
}
package com.tgb.activemq;import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
/*** 消息的生产者(发送者) * @author liang**/
public class JMSProducer {//默认连接用户名private static final String USERNAME = "system";//默认连接密码private static final String PASSWORD = "manager";//默认连接地址private static final String BROKEURL = ActiveMQConnection.DEFAULT_BROKER_URL;//发送的消息数量private static final int SENDNUM = 10;public static void main(String[] args) {//连接工厂ConnectionFactory connectionFactory;//连接Connection connection = null;//会话 接受或者发送消息的线程Session session;//消息的目的地Destination destination;//消息生产者MessageProducer messageProducer;//实例化连接工厂connectionFactory = new ActiveMQConnectionFactory(JMSProducer.USERNAME, JMSProducer.PASSWORD, JMSProducer.BROKEURL);try {//通过连接工厂获取连接connection = connectionFactory.createConnection();//启动连接connection.start();//创建sessionsession = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);//创建一个名称为HelloWorld的消息队列destination = session.createQueue("HelloWorld");//创建消息生产者messageProducer = session.createProducer(destination);//发送消息sendMessage(session, messageProducer);session.commit();} catch (Exception e) {e.printStackTrace();}finally{if(connection != null){try {connection.close();} catch (JMSException e) {e.printStackTrace();}}}}/*** 发送消息* @param session* @param messageProducer  消息生产者* @throws Exception*/public static void sendMessage(Session session,MessageProducer messageProducer) throws Exception{for (int i = 0; i < JMSProducer.SENDNUM; i++) {//创建一条文本消息 TextMessage message = session.createTextMessage("ActiveMQ 发送消息" +i);System.out.println("发送消息:Activemq 发送消息" + i);//通过消息生产者发出消息 messageProducer.send(message);}}
}

结果

 INFO | Successfully connected to tcp://localhost:61616
收到的消息:ActiveMQ 发送消息0
收到的消息:ActiveMQ 发送消息1
收到的消息:ActiveMQ 发送消息2
收到的消息:ActiveMQ 发送消息3
收到的消息:ActiveMQ 发送消息4
收到的消息:ActiveMQ 发送消息5
收到的消息:ActiveMQ 发送消息6
收到的消息:ActiveMQ 发送消息7

如果用户名或密码不正确

INFO | Successfully connected to tcp://localhost:61616
javax.jms.JMSSecurityException: User name [system] or password is invalid.at
。。。。。。。。。。

第二种方式:JAAS authentication(JAAS身份验证)

- 在conf/activemq.xml文件中加上

<plugins>    <!--use JAAS to authenticate using the login.config file on the classpath to configure JAAS -->    <jaasAuthenticationPlugin configuration="activemq-domain" />    <!--  lets configure a destination based authorization mechanism -->    <authorizationPlugin>    <map>    <authorizationMap>    <authorizationEntries>    <!--  USERS.>表示以USERS.开头的主题;>表示所有主题,read表示读的权限,write表示写的权限,admin表示角色组 -->    <authorizationEntry queue=">" read="admins" write="admins" admin="admins" />    <authorizationEntry topic=">" read="admins" write="admins" admin="admins" />    <authorizationEntry queue="ActiveMQ.Advisory.>" read="admins" write="admins" admin="admins" />    <authorizationEntry topic="ActiveMQ.Advisory.>" read="admins" write="admins" admin="admins" />    </authorizationEntries>    </authorizationMap>    </map>    </authorizationPlugin>
</plugins> 

- 在conf目录下的login.config,groups.properties,users.properties

login.config

activemq {org.apache.activemq.jaas.PropertiesLoginModule requiredorg.apache.activemq.jaas.properties.user="users.properties"org.apache.activemq.jaas.properties.group="groups.properties";
};

groups.properties

#group=userName
admins=system  

users.properties

#userName=password
system=manager

使用方式与简单身份验证相似。


但是这只是broker-level的验证和授权,即只有在客户端对broker发起连接时才会发挥做用,但是有的时候我们授权特定的message才能到达destination,这个时候我们就需要Message-level身份验证

下面这个例子实现了消费者和broker在同一个主机上message才能到达destination的例子

public class AuthorizationPolicy implements MessageAuthorizationPolicy {private static final Log LOG =LogFactory.getLog(AuthorizationPolicy.class);public boolean isAllowedToConsume(ConnectionContext context,
Message message) { LOG.info(context.getConnection().getRemoteAddress());String remoteAddress = context.getConnection().getRemoteAddress();if (remoteAddress.startsWith("/127.0.0.1")) {LOG.info("Permission to consume granted");return true;} else {LOG.info("Permission to consume denied");return false;}}
}

很简单,只需要实现isAllowedToConsume方法,然后把AuthorizationPolicy用类似spring的方式写入到配置文件中

<messageAuthorizationPolicy><bean
    class="org.apache.activemq.book.ch6.AuthorizationPolicy"xmlns="http://www.springframework.org/schema/beans" />
</messageAuthorizationPolicy>

注意,要想注入成功必须用mvn clean install把项目打包,然后在class中写上正确的路径,不然很容易启动失败。activemq有时候很坑爹,写着activemq is running at pid:XXXX实际上运行失败。。

查看activemq是否成功启动的方法:

1####.查看data/log文件,从日志查看启动结果最稳妥

2.在终端查看端口 16161是否被占用

3.直接在网页访问 http://localhost:8161/

推荐第一种方法

上面介绍了两种安全插件还有配置message-level的像过滤器一样的bean,下面一节将介绍自定义插件和ssl方式的安全配置。

ActiveMQ的安全配置(九)相关推荐

  1. activemq安装与配置_ActiveMQ(消息队列)从入门到了解

    一. ActiveMQ 简介 1 什么是 ActiveMQ ActiveMQ 是 Apache 出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个 完全支持 JMS1.1 和 J2EE ...

  2. linux下activemq安装与配置

    一.下载:apache-activemq-5.14.0-bin.tar.gz http://activemq.apache.org/activemq-5140-release.html 二.安装act ...

  3. java 监听队列_spring+activemq实战之配置监听多队列实现不同队列消息消费

    摘选:https://my.oschina.net/u/3613230/blog/1457227 摘要: 最近在项目开发中,需要用到activemq,用的时候,发现在同一个项目中point-to-po ...

  4. ActiveMQ (二) 常用配置简介

    ActiveMQ的主要配置文件 ActiveMQ的一些常用的属性很多可以在对应的配置文件中进行配置的.比如访问web console的管理端的端口,用户名密码,连接MQ时的用户名和密码,持久化设置,是 ...

  5. centos activemq 集群配置 Networks of Brokers

    1.安装JDK运行环境 #cd /opt#wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=a ...

  6. linux activemq修改端口号,linux下 activemq集群配置

    1.简述:回想老王打电话讲故事案例. 2.优势:解耦,异步,横向扩展,顺序保障,安全可靠... 3.JMS(java message service),是java平台中关于面向消息中间件的API,用于 ...

  7. ActiveMQ BrokeUrl的配置和消息持久化配置

    很多文章Provider和Consumer的连接服务器地址brokeUrl都写成"tcp://192.168.1.139:61616" 并没有交代为啥是61616,而且我做实验换成 ...

  8. ActiveMQ—安装配置及使用

    安装配置及使用 转自:http://blog.csdn.net/qq_21033663/article/details/52461543 (一)ActiveMQ介绍 ActiveMQ 是Apache出 ...

  9. ActiveMQ — 集群 — 安装与配置

    2019独角兽企业重金招聘Python工程师标准>>> 1. 服务器配置 推荐集群的数量为基数,并且在这些机器上安装JDK,配置环境变量. 2. 集群方式 常用的集群方式有三种: 基 ...

最新文章

  1. java 堆排序方式_幾種排序方式的java實現(02:希爾排序,歸並排序,堆排序)
  2. FileFilter接口 java
  3. 苹果侧边滑动返回_后置指纹、侧边指纹、屏幕指纹到底哪个更好用? 来讨论一下!...
  4. oracle 日期 加一秒,Leap Second (闰秒) 在ORACLE环境的影响
  5. 从0移植uboot (二) _启动流程分析
  6. MyEclipse10.6 安装SVN插件方法及插件下载地址
  7. 高级c语言程序设计视频教程,C语言高级编程视频教程
  8. 冰心吴文藻的爱情始于留学远洋客轮上
  9. pgloader:Heap exhausted ,game over
  10. 节省处理HPC数据泛滥开支的可用工具
  11. 彻底搞懂MySQL的索引
  12. 求矩阵主对角线元素的和
  13. 小程序实现图片双滑放大缩小
  14. 117道Java面试题及答案(大多都是项目里面所用到的技术点)
  15. 操作系统学习——分时操作系统
  16. EXCEL VB简单使用
  17. 【JavaSe,Day03,note】
  18. MIT 3.054胞状材料、多孔材料课程笔记-Lecture4:蜂窝材料面内机械性能
  19. POJ 2559 题解 最大矩形面积 单调栈
  20. windows xp安装驱动时提示驱动未通过微软数字签名

热门文章

  1. 逆向工程核心原理读书笔记-代码注入
  2. 读取SSDT表和原函数地址
  3. Linux 进程信号:信号的概念、生命周期、产生流程、阻塞
  4. MongoDB入门教程(1)
  5. redis一主一从一哨兵,第一次主从切换成功,再次主从切换无法正常执行?
  6. MySQL 的 bug 必须修复吗?
  7. 《微服务架构设计模式》总结,文末送书
  8. Facebook 最新可佩戴 AR 设备、AR 设备未来五年市场扩张、语音社交新创Swell等|Decode the Week...
  9. LiveVideoStackCon讲师热身分享 ( 三 ) —— Facebook的工具文化与多媒体QoE
  10. LeetCode——DFS