ActiveMQ(3) ActiveMQ創建(simpleAuthenticationPlugin)安全認證


控制端安全認證:

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>
jetty.xml

<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
jetty-realm.properties

認證用戶名: 認證密碼 [,角色名稱 ...]

注意: 配置需重啟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>
activemq.xml

在代碼中認證:

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)
Exception

認證成功代碼:

消息生產者:

 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 }
Sender.Java

 消息消費者:

 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 }
Receiver.Java

 認證常量類:

 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 }
Constants.Java

 

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM