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;??
- ????}??
- }??
- <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>