除非我写了更多描述而不是源代码,否则我不能发布此问题。这就是为什么我只写几篇文章。

我有以下课程。我的目标是通过设置此插件来保护BrokerService。

   public class MyAuthenticationPlugin extends SimpleAuthenticationPlugin {
        private String  username ="username";
        private String  password ="password";

        public MyAuthenticationPlugin(){
            secureME();
        }
        public void secureME(){
            Map<String, String> map = new HashMap<String, String>();
            map.put(username, password);
            this.setUserPasswords(map);
        }
    }


后来我尝试使用上述类,如下所示,我得到了NullPointerException异常:

    public class Server{
        private static int ackMode;
        private static String messageQueueName;
        private static String messageBrokerUrl;

        private Session session;
        private boolean transacted = false;
        private MessageProducer replyProducer;
        private MessageProtocol messageProtocol;
        private String  username ="username";
        private String  password ="password";

        static {
            messageBrokerUrl = "tcp://localhost:61616";
            messageQueueName = "client.messages";
            ackMode = Session.AUTO_ACKNOWLEDGE;
        }

        public Server() {
            try {
                //This message broker is embedded
                BrokerService broker = new BrokerService();
                broker.setPersistent(false);
                broker.setUseJmx(false);
                broker.addConnector(messageBrokerUrl);
                // here I'm add my class as plguing
                MyAuthenticationPlugin[] myAuthenticationPlugin = new
                MyAuthenticationPlugin[1];
                myAuthenticationPlugin[0] = new MyAuthenticationPlugin();

                broker.setPlugins(myAuthenticationPlugin);
                broker.start();
            } catch (Exception e) {
                System.out.println("Exception: "+e.getMessage());
                //Handle the exception appropriately
            }
        }

        private void setupMessageQueueConsumer() {
            ActiveMQConnectionFactory connectionFactory = new
               ActiveMQConnectionFactory(messageBrokerUrl);

            connectionFactory.setUserName(username);
            connectionFactory.setPassword(password);

            Connection connection;
            try {
                connection = connectionFactory.createConnection(username, password);


                connection.start(); // This line thows exception
                this.session = connection.createSession(this.transacted, ackMode);
                Destination adminQueue = this.session.createQueue(messageQueueName);

                //Setup a message producer to respond to messages from clients, we will get the destination
                //to send to from the JMSReplyTo header field from a Message
                this.replyProducer = this.session.createProducer(null);
                this.replyProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

                //Set up a consumer to consume messages off of the admin queue
                MessageConsumer consumer = this.session.createConsumer(adminQueue);
                consumer.setMessageListener(this);

              //  new BufferedReader(new InputStreamReader(System.in)).readLine();

            } catch (JMSException e) {
                System.out.println("Exception: "+e.getMessage());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        public static void main(String[] args) {
            new Server();
            System.out.println("I'm done. END");
        }
    }


我的主要目的是通过设置用户名,密码,访问组权限等来确保我的BrokerService的安全。请向我建议如何在BrokerService中设置用户名,密码,访问组权限以提高安全性。

用堆栈跟踪更新:

    result = {StackTraceElement[7]@1015}
     0 = {StackTraceElement@1016} "org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:49)"
      declaringClass = "org.apache.activemq.util.JMSExceptionSupport"
      methodName = "create"
      fileName = "JMSExceptionSupport.java"
      lineNumber = 49
     1 = {StackTraceElement@1017} "org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1377)"
      declaringClass = "org.apache.activemq.ActiveMQConnection"
      methodName = "syncSendPacket"
      fileName = "ActiveMQConnection.java"
      lineNumber = 1377
     2 = {StackTraceElement@1018} "org.apache.activemq.ActiveMQConnection.ensureConnectionInfoSent(ActiveMQConnection.java:1481)"
      declaringClass = "org.apache.activemq.ActiveMQConnection"
      methodName = "ensureConnectionInfoSent"
      fileName = "ActiveMQConnection.java"
      lineNumber = 1481
     3 = {StackTraceElement@1019} "org.apache.activemq.ActiveMQConnection.start(ActiveMQConnection.java:516)"
      declaringClass = "org.apache.activemq.ActiveMQConnection"
      methodName = "start"
      fileName = "ActiveMQConnection.java"
      lineNumber = 516
     4 = {StackTraceElement@1020} "com.ma.home.Server.setupMessageQueueConsumer(Server.java:57)"
      declaringClass = "com.ma.home.Server"
      methodName = "setupMessageQueueConsumer"
      fileName = "Server.java"
      lineNumber = 57
     5 = {StackTraceElement@1021} "com.ma.home.Server.<init>(Server.java:46)"
      declaringClass = "com.ma.home.Server"
      methodName = "<init>"
      fileName = "Server.java"
      lineNumber = 46
     6 = {StackTraceElement@1022} "com.ma.home.Server.main(Server.java:84)"
      declaringClass = "com.ma.home.Server"
      methodName = "main"
      fileName = "Server.java"
      lineNumber = 84

最佳答案

我必须添加AuthenticationUser以及所有三个正确的参数,例如用户名,密码,组。我以前没有在代码中提供组。因此,遵循代码将解决。另外,它也可以正常工作。

        public class MyAuthenticationPlugin extends SimpleAuthenticationPlugin {
            private String  username ="username";
            private String  password ="password";
            private String  groups = "groups";

            Map<String, String> userPasswords = new HashMap<String, String>();
            List<AuthenticationUser> authenticationUserList = new ArrayList();

            public MyAuthenticationPlugin(){
                secureME();
            }
            public void secureME(){
                userPasswords.put(username, password);
                authenticationUserList.add(new AuthenticationUser(username,password, groups));
                this.setUserPasswords(userPasswords);
                this.setUsers(authenticationUserList);
            }
   }

10-08 00:03