一、认证认证(authentication):验证某个实体或者用户是否有权限访问受保护资源。
mq提供两种插件用于权限认证:
(一)、simple authentication plug-in:直接把相关的权限认证信息配置到xml文件中。
配置 conf/activemq.xml 的 broke元素添加插件:
<plugins><simpleauthenticationplugin><users><authenticationuser username="admin" password="password" groups="admins,publishers,consumers"/><authenticationuser username="publisher" password="password" groups="publishers,consumers"/><authenticationuser username="consumer" password="password" groups="consumers"/><authenticationuser username="guest" password="password" groups="guests"/></users></simpleauthenticationplugin></plugins>
代码中的认证方式两种:
1、在创建connection的时候认证
//用户认证connection conn = connfactory.createconnection(admin,password);
2、也可以在创建connectionfactory工厂的时候认证
connectionfactory connfactory = new activemqconnectionfactory(admin,password,url);
(二)、jaas authentication plug-in:实现了jaas api,提供了一个更强大的和可定制的权限方案。
配置方式:
1、在conf目录中创建 login.config 文件 用户 配置 propertiesloginmodule:
activemq-domain {
org.apache.activemq.jaas.propertiesloginmodule required debug=trueorg.apache.activemq.jaas.properties.user=users.propertiesorg.apache.activemq.jaas.properties.group=groups.properties;
};
2、在conf目录中创建users.properties 文件用户配置用户:
# 创建四个用户
admin=password
publisher=password
consumer=password
guest=password
3、在conf目录中创建groups.properties 文件用户配置用户组:
#创建四个组并分配用户
admins=admin
publishers=admin,publisher
consumers=admin,publisher,consumer
guests=guest
4、将该配置插入到activemq.xml中:
<!-- jaas authentication plug-in --><plugins><jaasauthenticationplugin configuration="activemq-domain" /></plugins>
5、配置mq的启动参数:
使用dos命令启动:
d:\tools\apache-activemq-5.6.0-bin\apache-activemq-5.6.0\bin\win64>activemq.bat -djava.security.auth.login.config=d:/tools/apache-activemq-5.6.0-bin/apache-activemq-5.6.0/conf/login.config
6、在代码中的认证方式与simple authentication plug-in 相同。
二、授权基于认证的基础上,可以根据实际用户角色来授予相应的权限,如有些用户有队列写的权限,有些则只能读等等。
两种授权方式
(一)、目的地级别授权
jms目的地的三种操作级别:
read :读取目的地消息权限
write:发送消息到目的地权限
admin:管理目的地的权限
配置方式 conf/activemq.xml :
<plugins><jaasauthenticationplugin configuration="activemq-domain" /><authorizationplugin><map><authorizationmap><authorizationentries><authorizationentry topic="topic.ch09" read="consumers" write="publishers" admin="publishers" /></authorizationentries></authorizationmap></map></authorizationplugin></plugins>
(二)、消息级别授权
授权特定的消息。
开发步骤:
1、实现消息授权插件,需要实现messageauthorizationpolicy接口
public class authorizationpolicy implements messageauthorizationpolicy {private static final log log = logfactory.
getlog(authorizationpolicy.class);public boolean isallowedtoconsume(connectioncontext context,
message message) {
log.info(context.getconnection().getremoteaddress());
string remoteaddress = context.getconnection().getremoteaddress();if (remoteaddress.startswith(/127.0.0.1)) {
log.info(permission to consume granted);return true;
} else {
log.info(permission to consume denied);return false;
}
}
}
2、把插件实现类打成jar包,放入到activemq 的 lib目录中
3、在activemq.xml中设置<messageauthorizationpolicy>元素
<messageauthorizationpolicy><bean class="org.apache.activemq.book.ch6.authorizationpolicy" xmlns="http://www.springframework.org/schema/beans" /></messageauthorizationpolicy>
三、自定义安全插件插件逻辑需要实现brokerfilter类,并且通过brokerplugin实现类来安装,用于拦截,broker级别的操作:
接入消费者和生产者
提交事务
添加和删除broker的连接
demo:基于ip地址,限制broker连接。
package ch02.ptp;import java.util.list;import org.apache.activemq.broker.broker;import org.apache.activemq.broker.brokerfilter;import org.apache.activemq.broker.connectioncontext;import org.apache.activemq.command.connectioninfo;public class ipauthenticationbroker extends brokerfilter {
list<string> allowedipaddresses;public ipauthenticationbroker(broker next, list<string>allowedipaddresses) {super(next);this.allowedipaddresses = allowedipaddresses;
}public void addconnection(connectioncontext context, connectioninfo info) throws exception {
string remoteaddress = context.getconnection().getremoteaddress();if (!allowedipaddresses.contains(remoteaddress)) {throw new securityexception(connecting from ip address
+ remoteaddress+ is not allowed );
}super.addconnection(context, info);
}
}
安装插件:
package ch02.ptp;import java.util.list;import org.apache.activemq.broker.broker;import org.apache.activemq.broker.brokerplugin;public class ipauthenticationplugin implements brokerplugin {
list<string> allowedipaddresses;public broker installplugin(broker broker) throws exception {return new ipauthenticationbroker(broker, allowedipaddresses);
}public list<string> getallowedipaddresses() {return allowedipaddresses;
}public void setallowedipaddresses(list<string> allowedipaddresses) {this.allowedipaddresses = allowedipaddresses;
}
}
ps:将这连个类打成jar包放到activemq的lib目录下
配置自定义插件:
<plugins><bean xmlns="http://www.springframework.org/schema/beans" id="ipauthenticationplugin" class="org.apache.activemq.book.ch6.ipauthenticationplugin"><property name="allowedipaddresses"><list><value>127.0.0.1</value></list></property></bean></plugins>
以上就是详解jms 之 active mq的安全机制的详细内容。