现在的位置: 首页 > 综合 > 正文

为ActiveMQ服务器添加简单验证机制

2018年08月11日 ⁄ 综合 ⁄ 共 3558字 ⁄ 字号 评论关闭

ActiveMQ现在无疑成为JMS领域开源产品的龙头,基于开源框架的J2EE开发者大多用它来进行异步数据的传递工作。

比较搞的是截至ActiveMQ4.1.1版本的缺省配置仍然没有做任何的安全性配置,也就是说如果没有在软硬件防火墙层面上做限制的话,任何客户
端都可以连接上JMS提供者发送和接收消息!估计大部分开发者用的都是缺省设置吧,呵呵。

当然,ActiveMQ的开发者还不至于弱智到这种程度,连最起码的权限验证都不支持。在org.apache.activemq.security包下面是提供了两种可选验证机制的:用户名/密码Map和JAAS。

无疑,基于JAAS的验证是J2EE规范之一,能实现最大的灵活性配置,不过一般情况下异步发个邮件什么的应用没有必要搞这么复杂。这里关注的是最
简单的用户名/密码验证方法,就像JDBC数据源一样。

ActiveMQ服务broker是在activemq.xml

中配置的,其本质上也是
一个spring bean配置文件。4.0版本以后支持xbean配置方式,典型的配置文件如下:

xml

代码 
  1. <
    broker
     
    brokerName
    =
    "localhost"
     
    useJmx
    =
    "true"
    >
      
  2.     
    <
    persistenceAdapter
    >
      
  3.         
    <
    journaledJDBC
     
    journalLogFiles
    =
    "5"
     
    dataDirectory
    =
    "${webapp.root.cn.com.reachway}/WEB-INF/activemq-data"
      
  4.             
    dataSource
    =
    "#derby-ds"
     
    />
      
  5.     </

    persistenceAdapter
    >
      

  6.   
  7.     
    <
    transportConnectors
    >
      
  8.         
    <
    transportConnector
     
    name
    =
    "openwire"
     
    uri
    =
    "tcp://localhost:61616"
     
    discoveryUri
    =
    "multicast://default"
     
    />
      
  9.     </

    transportConnectors
    >
      

  10.   
  11.     
    <
    networkConnectors
    >
      
  12.         
    <
    networkConnector
     
    name
    =
    "default-nc"
     
    uri
    =
    "multicast://default"
     
    />
      
  13.     </

    networkConnectors
    >
      

  14. </broker
    >
      

broker实质上就是一个org.apache.activemq.broker.
BrokerService实例,可以扩展之以提供简单验证,如下:

java 代码
  1. public


     
    class


     ConfigurableAuthenticationBroker 
    extends


     XBeanBrokerService {
      

  2.   
  3.     
    private


     String userName = 
    "jms"

    ;
      
  4.        
  5.     
    private


     String password = 
    "password"

    ;
      
  6.   
  7.     
    public


     String getUserName() {
      
  8.         
    return


     userName;
      
  9.     }   
  10.   
  11.     
    public


     
    void


     setUserName(String userName) {
      
  12.         
    this


    .userName = userName;
      
  13.     }   
  14.   
  15.     
    public


     String getPassword() {
      
  16.         
    return


     password;
      
  17.     }   
  18.   
  19.     
    public


     
    void


     setPassword(String password) {
      
  20.         
    this


    .password = password;
      
  21.     }   
  22.   
  23.     
    protected


     Broker addInterceptors(Broker broker) 
    throws


     Exception {
      
  24.         broker = 
    super


    .addInterceptors(broker);
      
  25.            
  26.         Map userPasswordMap = 
    new


     HashMap();
      
  27.         userPasswordMap.put(userName, password);
      
  28.         broker = 
    new


     SimpleAuthenticationBroker(broker, userPasswordMap, 
    new


     HashMap());
      
  29.            
  30.         
    return


     broker;
      
  31.     }   
  32.        
  33. }  

由于这里采用xbean方式配置,所以扩展的是XBeanBrokerService
类。

相应的activemq.xml

中的broker配置改为:

xml

代码
  1. <
    c:ConfigurableAuthenticationBroker
     
    brokerName
    =
    "localhost"
     
    useJmx
    =
    "true"
     
    userName
    =
    "jms"
     
    password
    =
    "password"
      
  2.     
    xml

    ns:c

    =
    "java://cn.com.xxx.framework.common.jms"
    >
      
  3.     
    <
    persistenceAdapter
    >
      
  4.         
    <
    journaledJDBC
     
    journalLogFiles
    =
    "5"
     
    dataDirectory
    =
    "${webapp.root.cn.com.xxx}/WEB-INF/activemq-data"
      
  5.             
    dataSource
    =
    "#derby-ds"
     
    />
      
  6.     </

    persistenceAdapter
    >
      

  7.   
  8.     
    <
    transportConnectors
    >
      
  9.         
    <
    transportConnector
     
    name
    =
    "openwire"
     
    uri
    =
    "tcp://localhost:61616"
     
    discoveryUri
    =
    "multicast://default"
     
    />
      
  10.     </

    transportConnectors
    >
      

  11.   
  12.     
    <
    networkConnectors
    >
      
  13.         
    <
    networkConnector
     
    name
    =
    "default-nc"
     
    uri
    =
    "multicast://default"
     
    />
      
  14.     </

    networkConnectors
    >
      

  15. </c:ConfigurableAuthenticationBroker


    >

      

可以看到在bean c:ConfigurableAuthenticationBroker
的属性中多了userName和password,于是可配置性便有了。如果想要配置更多的用户可以改成map型了,道理都是一样的。

相应的,JMS客户端在连接时就需要加上用户名和密码属性了,否则就会返回错误:

java 代码
  1. javax.jms.JMSException: User name or password is invalid.
      

  2.     at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:
    46
    )   
  3.     at org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:
    1181
    )   
  4.     at org.apache.activemq.ActiveMQConnection.ensureConnectionInfoSent(ActiveMQConnection.java:
    1263
    )   

若是采用的spring管理的JMS资源适配器方式,给适配器bean加上用户名、密码属性即可:

xml

代码

  1.   
  2. <
    bean
     
    id
    =
    "jmsResourceAdapter"
     
    class
    =
    "org.apache.activemq.ra.ActiveMQResourceAdapter"
    >
      
  3.     
    <
    property
     
    name
    =
    "serverUrl"
     
    value
    =
    "tcp://localhost:61616"
     
    />
      
  4.     
    <
    property
     
    name
    =
    "userName"
     
    value
    =
    "jms"
     
    />
      
  5.     
    <
    property
     
    name
    =
    "password"
     
    value
    =
    "password"
     
    />
      
  6. </bean
    >

      

其实很简单,但也够用了。回头有空再研究下JAAS方式吧:)

抱歉!评论已关闭.