2.4 Security
ActiveMQ支持可插拔的安全机制,用以在不同的provider之间切换。
2.4.1 Simple Authentication Plugin
Simple Authentication Plugin适用于简单的认证需求,或者用于建立测试环境。它允许在XML配置文件中指定用户、用户组和密码等信息。以下是ActiveMQ配置的一个例子:
-
<
plugins
>
-
...
-
<simpleAuthenticationPlugin>
-
<users>
-
<authenticationUser username="system" password="manager" groups="users,admins"/>
-
<authenticationUser username="user" password="password" groups="users"/>
-
<authenticationUser username="guest" password="password" groups="guests"/>
-
</users>
-
</simpleAuthenticationPlugin>
-
</
plugins
>
2.4.2 JAAS Authentication Plugin
JAAS Authentication
Plugin依赖标准的JAAS机制来实现认证。通常情况下,你需要通过设置java.security.auth.login.config系统属性来
配置login modules的配置文件。如果没有指定这个系统属性,那么JAAS Authentication
Plugin会缺省使用login.config作为文件名。以下是一个login.config文件的例子:
activemq-domain {
org.apache.activemq.jaas.PropertiesLoginModule required
debug=true
org.apache.activemq.jaas.properties.user="users.properties"
org.apache.activemq.jaas.properties.group="groups.properties";
};
这个login.config文件中设置了两个属性:org.apache.activemq.jaas.properties.user和
org.apache.activemq.jaas.properties.group分别用来指向user.properties和
group.properties文件。需要注意的是,PropertiesLoginModule使用本地文件的查找方式,而且查找时采用的base
directory是login.config文件所在的目录。因此这个login.config说明user.properties和
group.properties文件存放在跟login.config文件相同的目录里。
以下是ActiveMQ配置的一个例子:
-
<
plugins
>
-
...
-
<jaasAuthenticationPlugin configuration="activemq-domain" />
-
</
plugins
>
基于以上的配置,在JAAS的LoginContext中会使用activemq-domain中配置的PropertiesLoginModule来进行登陆。
ActiveMQ JAAS还支持LDAPLoginModule、CertificateLoginModule、TextFileCertificateLoginModule等login module。
2.4.3 Custom Authentication Implementation
可以通过编码的方式为ActiveMQ增加认证功能。例如编写一个类继承自XBeanBrokerService。
-
package
com.yourpackage;
-
-
import
java.net.URI;
-
import
java.util.HashMap;
-
import
java.util.Map;
-
-
import
org.apache.activemq.broker.Broker;
-
import
org.apache.activemq.broker.BrokerFactory;
-
import
org.apache.activemq.broker.BrokerService;
-
import
org.apache.activemq.security.SimpleAuthenticationBroker;
-
import
org.apache.activemq.xbean.XBeanBrokerService;
-
-
public
class
SimpleAuthBroker
extends
XBeanBrokerService {
-
-
private String user;
-
private String password;
-
-
@SuppressWarnings("unchecked")
-
protected Broker addInterceptors(Broker broker) throws Exception {
-
broker = super.addInterceptors(broker);
-
Map passwords = new HashMap();
-
passwords.put(getUser(), getPassword());
-
broker = new SimpleAuthenticationBroker(broker, passwords, new HashMap());
-
return broker;
-
}
-
-
public String getUser() {
-
return user;
-
}
-
-
public void setUser(String user) {
-
this.user = user;
-
}
-
-
public String getPassword() {
-
return password;
-
}
-
-
public void setPassword(String password) {
-
this.password = password;
-
}
-
}
以下是ActiveMQ配置文件的一个例子:
- <beans>
- …
- <auth:SimpleAuthBroker
- xmlns:auth="java://com.yourpackage"
- xmlns="http://activemq.org/config/1.0" brokerName="SimpleAuthBroker1" user="user" password="password" useJmx="true">
-
- <transportConnectors>
- <transportConnector uri="tcp://localhost:61616"/>
- </transportConnectors>
- </auth:SimpleAuthBroker>
- …
- </beans>
在这个配置文件中增加了一个namespace
auth,用于指向之前编写的哪个类。同时为SimpleAuthBroker注入了两个属性值user和password,因此在被
SimpleAuthBroker改写的addInterceptors方法里,可以使用这两个属性进行认证了。ActiveMQ提供的
SimpleAuthenticationBroker类继承自BrokerFilter(可以简单的看成是Broker的Adaptor),它的构造函
数中的两个Map分别是userPasswords和userGroups。 SimpleAuthenticationBroker在
addConnection方法中使用userPasswords进行认证,同时会把userGroups的信息保存到
ConnectionContext中 。
2.4.4 Authorization Plugin
可以通过Authorization Plugin为认证后的用户授权,以下ActiveMQ配置文件的一个例子:
- <plugins>
- <jaasAuthenticationPlugin configuration="activemq-domain"/>
-
- <authorizationPlugin>
- <map>
- <authorizationMap>
- <authorizationEntries>
- <authorizationEntry queue=">" read="admins" write="admins" admin="admins" />
- <authorizationEntry queue="USERS.>" read="users" write="users" admin="users" />
- <authorizationEntry queue="GUEST.>" read="guests" write="guests,users" admin="guests,users" />
-
- <authorizationEntry topic=">" read="admins" write="admins" admin="admins" />
- <authorizationEntry topic="USERS.>" read="users" write="users" admin="users" />
- <authorizationEntry topic="GUEST.>" read="guests" write="guests,users" admin="guests,users" />
-
- <authorizationEntry topic="ActiveMQ.Advisory.>" read="guests,users" write="guests,users" admin="guests,users"/>
- </authorizationEntries>
- </authorizationMap>
- </map>
- </authorizationPlugin>
- </plugins>