除非我写了更多描述而不是源代码,否则我不能发布此问题。这就是为什么我只写几篇文章。
我有以下课程。我的目标是通过设置此插件来保护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);
}
}