代码之家  ›  专栏  ›  技术社区  ›  Dinesh Bolkensteyn

glassfish jms(平面文件)身份验证

  •  5
  • Dinesh Bolkensteyn  · 技术社区  · 14 年前

    在glassfish上很容易设置平面文件jms身份验证(请参见 http://docs.sun.com/app/docs/doc/821-0027/aeofg?a=view )。

    问题出在客户端。我正在编写一个独立的Java客户端来访问我的JMS ReS信源( ConnectionFactory Destination )通过JNDI。

    如何从该客户机向jms传递用户名和密码?

    我已经试过几次了,比如:

    1)在InitialContext中添加这些凭据

     context.addToEnvironment(InitialContext.SECURITY_PRINCIPAL, "username");
     context.addToEnvironment(InitialContext.SECURITY_CREDENTIALS, "password");
    

    2)在连接工厂中使用jms用户名和密码参数

     connectionFactory.createConnection();
    

    然而,这些方法都不起作用。

    当我运行这个程序时,我会得到:

    com.sun.messaging.jms.JMSSecurityException: [C4084]: Échec de 
    l'authentification de l'utilisateur :  user=guest, broker=localhost:7676(34576) 
    at com.sun.messaging.jmq.jmsclient.ProtocolHandler.authenticate
    (ProtocolHandler.java:1084)
    

    所以它一直试图向“来宾”用户进行身份验证。

    在这次测试中,我用 connection.NORMAL.deny.user=* 作为许可规则( accesscontrol.properties )

    有趣的是,即使在获得连接因子之前,也会引发此异常:

     InitialContext context = new InitialContext();
    
     ConnectionFactory connectionFactory = 
     (ConnectionFactory)context.lookup("jms/middleware/factory"); 
     /* The exception is thrown here, so authentication MUST have happened 
        before already (i.e. NOT in the createConnection(username, password) method) */
    

    希望有人知道答案。

    多谢提前

    当做,

    迪内希

    1 回复  |  直到 14 年前
        1
  •  2
  •   Dinesh Bolkensteyn    14 年前

    好的,我找到了一个解决方法,它不是使用jndi,而是使用特定于供应商的jms api,如 http://weblogs.java.net/blog/kalali/archive/2010/03/02/open-mq-open-source-message-queuing-beginners-and-professionals-0

    最终代码是:

    com.sun.messaging.ConnectionFactory connectionFactory = new com.sun.messaging.ConnectionFactory();
    QueueConnection queueConnection = connectionFactory.createQueueConnection("user01", "password01");
    

    这一次导致了错误

    Error: [C4060]: Login failed:  user=user01, broker=localhost:7676(53445)
    

    太棒了;)

    所以,解决办法正在起作用。但是如果有人知道如何用jndi来实现这一点,那就更好了。