ActiveMQ 基于IP的验证和授权插件实现
2017-04-10 10:39
295 查看
一、实现原理
ActiveMQ 的层次结构图如图1.1所示。图1.1 ActiveMQ 结构层次图
由上图可知,ActiveMQ 主要由Connectors、Broker和Message Store三部分组成,在此重点关注Broker部分。Broker 在 ActiveMQ
中的表现形式为“Interface(接口)”,该接口封装了 ActiveMQ 的连接管理、Session管理、消息的发送和接收以及其它的一些功能方法;而 BrokerFilte
r实现了这个接口,并提供链式结构支持,其可以拦截所有Broker方法的实现并传递结果给链式结构的下一个节点,从而形成一个完整的“职责链”模式。
Broker 部分最下面的 Region 是核心组件,在其之上的都是 Broker 的各类插件,这些插件继承于 BrokerFilter,与 Broker
接口保持兼容但扩展了 Broker
的功能,各类插件的具体功能如下:
1)“System Plugin”是指 AciveMQ
内部使用 Plugin 机制实现的一些系统功能,用户不能定制;
2)“AMQ Plugin”指的是 ActiveMQ
已经实现好了,可以在配置文件中自由选择的一些插件,例如简单的安全插件和 JAAS 安全插件;
3)“USER Plugin”是指用户自己实现的 ActiveMQ
插件,需要用户把相关 jar 包放入到 ActiveMQ 的启动 classpath 中,并在配置文件中进行配置才能正确加载。
ActiveMQ 的插件实际上是基于 Broke r的一个 Filter 链,整个设计类似于 Server Applet 的 Filter
结构,所有的 Plugin 构成一个链式结构,每个插件实际上都是一个 “Interceptor”,类结构如图1.2所示:
图1.2 Broker 类结构图
由于 ActiveMQ
允许用户自己实现个性化插件,因此,基于 IP 的验证和授权插件可依此原理实现。
二、实现源码
1、IPAuthenticationPlugin
package tewa.apache.activemq.security; 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; } }
2、IPAuthenticationBroker
package tewa.apache.activemq.security; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.activemq.advisory.AdvisoryBroker; import org.apache.acti a214 vemq.broker.Broker; import org.apache.activemq.broker.BrokerFilter; import org.apache.activemq.broker.ConnectionContext; import org.apache.activemq.command.ConnectionInfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class IPAuthenticationBroker extends BrokerFilter { List<String> allowedIPAddresses; Pattern pattern = Pattern.compile("^([0-9\\.]*):(.*)"); private static final Logger log = LoggerFactory.getLogger(AdvisoryBroker.class); public IPAuthenticationBroker(Broker next, List<String> allowedIPAddresses) { super(next); this.allowedIPAddresses = allowedIPAddresses; } public String getSubAddress(String remoteAddress) { String subAddress = null; for (int i = 0; i < remoteAddress.length(); i++) { char ch = remoteAddress.charAt(i); if (ch >= '0' && ch <= '9') { subAddress = remoteAddress.substring(i); break; } } return subAddress; } @Override public void addConnection(ConnectionContext context, ConnectionInfo info) throws Exception { String remoteAddress = context.getConnection().getRemoteAddress(); //remoteAddress的形式如:tcp://127.0.0.1: 6572,由于正则表达式用得不好,在此截取127.0.0.1: 6572来判断 //这个正则表达式怎么用,欢迎赐教 Matcher matcher = pattern.matcher(getSubAddress(remoteAddress)); if (matcher.matches()) { String ip = matcher.group(1); if (!allowedIPAddresses.contains(ip)) { throw new SecurityException("Connecting from IP address " + ip + " is not allowed"); } else { log.info("Connecting from address {}", remoteAddress); } } else { throw new SecurityException("Invalid remote address " + remoteAddress + "subAddress " + getSubAddress(remoteAddress)); } super.addConnection(context, info); } }
三、安装插件
1、将代码导出 jar:IPAuthenticationPlugin.jar;2、将 jar 包拷贝至 activemq 目录下的 lib 目录下;
3、打开activemq\conf\activemq.xml,在 broker 节点中加入:
<plugins> <bean xmlns="http://www.springframework.org/schema/beans" id="ipAuthenticationPlugin" class="tewa.apache.activemq.security.IPAuthenticationPlugin"> <property name="allowedIPAddresses"> <list> <value>127.0.0.1</value> <value>192.168.168.1</value> </list> </property> </bean> </plugins>
4、重启 activemq 服务。
备注:
测试插件的 activemq 服务版本:V5.14.5;
插件源码下载路径:ActiveMQ 基于IP验证和授权插件的源码及jar
参考资料:
1、http://blog.csdn.net/scorpio3k/article/details/481598392、《ActiveMQ in Action》 6.3小节
相关文章推荐
- 重构客户注册-基于ActiveMQ实现短信验证码生产者
- spring security 3.1中基于数据库自定义验证授权功能实现
- spring security 3.1中基于数据库自定义验证授权功能实现
- 基于google插件Kaptcha实现图片验证码功能
- [转载]Asp.net(C#)中基于Forms验证的角色(用户组)验证授权过程
- 如何使用 C# .NET 在 ASP.NET 应用程序中实现基于窗体的身份验证
- WINDOWS (服务器) 和 DOS(客户端) 网络互连 基于TCP/IP的编程实现
- Asp.net中基于Forms验证的角色验证授权
- Asp.net中基于Forms验证的角色验证授权
- 基于授权和角色的访问控制的设计和实现(二)
- 基于授权和角色的访问控制的设计和实现(一)
- Asp.net中基于Forms验证的角色验证授权
- 《ASP.NET基于表单的验证实现网上安全访问,管理》
- Asp.net中基于Forms验证的角色验证授权
- 平台+插件软件设计思想及基于COM的原型实现
- [导入]如何使用 C# .NET 在 ASP.NET 应用程序中实现基于窗体的身份验证
- Asp.net中基于Forms验证的角色验证授权
- WINDOWS (服务器) 和 DOS(客户端) 网络互连 基于TCP/IP的编程实现
- ASP.NET基于表单的验证实现网上安全访问,管理(2)
- 在ASP.NET中如何用C#.NET实现基于表单的验证