控制端安全認證:
ActiveMQ目錄conf下jetty.xml:

1 <bean id="securityLoginService" class="org.eclipse.jetty.security.HashLoginService"> 2 <property name="name" value="ActiveMQRealm" /> 3 <property name="config" value="${activemq.conf}/jetty-realm.properties" /> 4 </bean> 5 6 <bean id="securityConstraint" class="org.eclipse.jetty.util.security.Constraint"> 7 <property name="name" value="BASIC" /> 8 <property name="roles" value="user,admin" /> 9 <!-- set authenticate=false to disable login --> 10 <property name="authenticate" value="true" /> 11 </bean>
<property name="authenticate" value="true" /> true: 需要認證 false: 不需要認證
ActiveMQ目錄conf下jetty-realm.properties:

1 # Defines users that can access the web (console, demo, etc.) 2 # username: password [,rolename ...] 3 admin: admin, admin 4 user: user, user
認證用戶名: 認證密碼 [,角色名稱 ...]
注意: 配置需重啟ActiveMQ才會生效。
客戶端安全認證:
simpleAuthenticationPlugin 認證: 直接把相關的認證插件配置到xml文件中
ActiveMQ目錄conf下activemq.xml的broker元素中添加插件:

1 <plugins> 2 <simpleAuthenticationPlugin> 3 <users> 4 <authenticationUser username="admin" password="admin" groups="admins,publishers,consumers"/> 5 <authenticationUser username="publisher" password="publisher" groups="publishers,consumers"/> 6 <authenticationUser username="consumer" password="consumer" groups="consumers"/> 7 <authenticationUser username="guest" password="guest" groups="guests"/> 8 </users> 9 </simpleAuthenticationPlugin> 10 </plugins>
在代碼中認證:
1 ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(Constants.AUTHENTICATION_USERNAME_ADMIN, 2 Constants.AUTHENTICATION_PASSWORD_ADMIN, "tcp://localhost:61616");
重啟ActiveMQ, 使配置生效。
用戶名和密碼認證失敗會拋出異常:

1 Exception in thread "main" javax.jms.JMSSecurityException: User name [ddd] or password is invalid. 2 at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:52) 3 at org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1399) 4 at org.apache.activemq.ActiveMQConnection.ensureConnectionInfoSent(ActiveMQConnection.java:1478) 5 at org.apache.activemq.ActiveMQConnection.start(ActiveMQConnection.java:527) 6 at com.itdoc.learn.activemq.helloworld.Sender.main(Sender.java:35) 7 Caused by: java.lang.SecurityException: User name [ddd] or password is invalid. 8 at org.apache.activemq.security.SimpleAuthenticationBroker.authenticate(SimpleAuthenticationBroker.java:103) 9 at org.apache.activemq.security.SimpleAuthenticationBroker.addConnection(SimpleAuthenticationBroker.java:71) 10 at org.apache.activemq.broker.BrokerFilter.addConnection(BrokerFilter.java:99) 11 at org.apache.activemq.broker.TransportConnection.processAddConnection(TransportConnection.java:843) 12 at org.apache.activemq.broker.jmx.ManagedTransportConnection.processAddConnection(ManagedTransportConnection.java:77) 13 at org.apache.activemq.command.ConnectionInfo.visit(ConnectionInfo.java:139) 14 at org.apache.activemq.broker.TransportConnection.service(TransportConnection.java:330) 15 at org.apache.activemq.broker.TransportConnection$1.onCommand(TransportConnection.java:194) 16 at org.apache.activemq.transport.MutexTransport.onCommand(MutexTransport.java:50) 17 at org.apache.activemq.transport.WireFormatNegotiator.onCommand(WireFormatNegotiator.java:125) 18 at org.apache.activemq.transport.AbstractInactivityMonitor.onCommand(AbstractInactivityMonitor.java:301) 19 at org.apache.activemq.transport.TransportSupport.doConsume(TransportSupport.java:83) 20 at org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:233) 21 at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:215) 22 at java.lang.Thread.run(Unknown Source)
認證成功代碼:
消息生產者:

1 /** 2 * @filename Sender.Java 3 * @desc 消息生產者 4 * @blog http://www.cnblogs.com/goodcheap 5 * @author Chinda Wang 6 * @create 2017-12-02 16:06 7 * @version v1.0 8 * @copyright Copyright © 2017 達華信息科技有限公司 版權所有 9 * @modifyhistory 2017-12-02 16:06 10 * @modifyauthor Chinda Wang 11 * @modifydesc 12 */ 13 package com.itdoc.learn.activemq.helloworld; 14 15 import com.itdoc.learn.activemq.common.Constants; 16 import org.apache.activemq.ActiveMQConnectionFactory; 17 18 import javax.jms.*; 19 20 /** 21 * @author Chinda Wang 22 * @desc 消息生產者 23 * @create 2017-12-02 16:06 24 */ 25 public class Sender { 26 27 public static void main(String[] args) throws Exception { 28 29 30 // 第一步: 建立 ConnectionFactory 工廠對象, 需要填入用戶名、密碼、以及要連接的地址, 均使用默認即可, 默認端口為"tcp//loclhost:61616" 31 ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(Constants.AUTHENTICATION_USERNAME_ADMIN, 32 Constants.AUTHENTICATION_PASSWORD_ADMIN, "tcp://localhost:61616"); 33 // 第二步: 通過ConnectionFactory工廠對象創建一個Connection連接, 並且調用Connection的start方法開啟連接, Connection默認是關閉的。 34 Connection connection = connectionFactory.createConnection(); 35 connection.start(); 36 /* 37 * 第三步: 通過Connection對象創建Session會話(上下文環境對象), 用於接收消息, 參數位置1為是否啟用事務, 參數位置2為簽收模式, 38 * 一般設置為自動簽收。 39 */ 40 Session session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE); 41 /* 42 * 第四步: 通過Session創建Destination對象, 指的是一個客戶端用來指定生產消息目標和消費消息來源的對象, 在PTP模式中, Destination 43 * 被稱作為Queue, 即隊列; 在Pub/Sub模式, Destination被稱作Topic, 即主題。在程序中可以使用多個Queue和Topic。 44 */ 45 Destination destination = session.createQueue("queue1"); 46 // 第五步: 需要通過Session對象創建消息的發送和接收對象(生產者和消費者)MessageProducer/MessageConsumer 47 MessageProducer producer = session.createProducer(destination); 48 // 第六步: 可以使用MessageProducer的setDeliveryMode()方法為其設置持久化特性和非持久化特性(DeliveryMode)。 49 producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); 50 /* 51 * 第七步: 使用JMS規范的TextMessage形式創建數據(通過Session對象), 並用MessageProducer的send()方法發送數據。同理, 客戶端使用 52 * receive()方法進行接收數據。 53 */ 54 TextMessage textMessage = session.createTextMessage(); 55 for (int i = 1; i <= 10; i++) { 56 textMessage.setText("I am Message! id: " + i); 57 producer.send(textMessage); 58 System.out.println("生產者: " + textMessage.getText()); 59 } 60 // 第八步: 關閉Connection連接 61 if (connection != null) { 62 connection.close(); 63 } 64 } 65 }
消息消費者:

1 /** 2 * @filename Receiver.Java 3 * @desc 消息消費者 4 * @blog http://www.cnblogs.com/goodcheap 5 * @author Chinda Wang 6 * @create 2017-12-02 16:07 7 * @version v1.0 8 * @copyright Copyright © 2017 達華信息科技有限公司 版權所有 9 * @modifyhistory 2017-12-02 16:07 10 * @modifyauthor Chinda Wang 11 * @modifydesc 12 */ 13 package com.itdoc.learn.activemq.helloworld; 14 15 import com.itdoc.learn.activemq.common.Constants; 16 import org.apache.activemq.ActiveMQConnectionFactory; 17 18 import javax.jms.*; 19 20 /** 21 * @desc 消息消費者 22 * @author Chinda Wang 23 * @create 2017-12-02 16:07 24 */ 25 public class Receiver { 26 27 public static void main(String[] args) throws Exception { 28 // 第一步: 建立 ConnectionFactory 工廠對象, 需要填入用戶名、密碼、以及要連接的地址, 均使用默認即可, 默認端口為"tcp//loclhost:61616" 29 ConnectionFactory connectionFactory = new ActiveMQConnectionFactory( 30 Constants.AUTHENTICATION_USERNAME_GUEST, 31 Constants.AUTHENTICATION_PASSWORD_GUEST, 32 "tcp://localhost:61616"); 33 // 第二步: 通過ConnectionFactory工廠對象創建一個Connection連接, 並且調用Connection的start方法開啟連接, Connection默認是關閉的。 34 Connection connection = connectionFactory.createConnection(); 35 connection.start(); 36 /* 37 * 第三步: 通過Connection對象創建Session會話(上下文環境對象), 用於接收消息, 參數位置1為是否啟用事務, 參數位置2為簽收模式, 38 * 一般設置為自動簽收。 39 */ 40 Session session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE); 41 /* 42 * 第四步: 通過Session創建Destination對象, 指的是一個客戶端用來指定生產消息目標和消費消息來源的對象, 在PTP模式中, Destination 43 * 被稱作為Queue, 即隊列; 在Pub/Sub模式, Destination被稱作Topic, 即主題。在程序中可以使用多個Queue和Topic。 44 */ 45 Destination destination = session.createQueue("queue1"); 46 // 第五步: 需要通過Session對象創建消息的發送和接收對象(生產者和消費者)MessageProducer/MessageConsumer 47 MessageConsumer consumer = session.createConsumer(destination); 48 /* 49 * 第六步: 使用JMS規范的TextMessage形式創建數據(通過Session對象), 並用MessageProducer的send()方法發送數據。同理, 客戶端使用 50 * receive()方法進行接收數據。 51 */ 52 while (true) { 53 TextMessage msg = (TextMessage) consumer.receive(); 54 if (msg == null) { 55 break; 56 } 57 System.out.println("收到內容: " + msg.getText()); 58 } 59 // 第七步: 關閉Connection連接 60 if (connection != null) { 61 connection.close(); 62 } 63 } 64 }
認證常量類:

1 /** 2 * @filename Constants.Java 3 * @desc 常量類 4 * @blog http://www.cnblogs.com/goodcheap 5 * @author Chinda Wang 6 * @create 2017-12-09 10:14 7 * @version v1.0 8 * @copyright Copyright © 2017 達華信息科技有限公司 版權所有 9 * @modifyhistory 2017-12-09 10:14 10 * @modifyauthor Chinda Wang 11 * @modifydesc 12 */ 13 package com.itdoc.learn.activemq.common; 14 15 /** 16 * @desc 常量類 17 * @author Chinda Wang 18 * @create 2017-12-09 10:14 19 */ 20 public class Constants { 21 22 /** 認證用戶名密碼 */ 23 public static final String AUTHENTICATION_USERNAME_ADMIN = "admin"; 24 public static final String AUTHENTICATION_PASSWORD_ADMIN = "admin"; 25 26 public static final String AUTHENTICATION_USERNAME_PUBLISHER = "publisher"; 27 public static final String AUTHENTICATION_PASSWORD_PUBLISHER = "publisher"; 28 29 public static final String AUTHENTICATION_USERNAME_CONSUMER = "consumer"; 30 public static final String AUTHENTICATION_PASSWORD_CONSUMER = "consumer"; 31 32 public static final String AUTHENTICATION_USERNAME_GUEST = "guest"; 33 public static final String AUTHENTICATION_PASSWORD_GUEST = "guest"; 34 35 }