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>