在Ignite中自定义身份认证安全插件
Ignite集群搭建完成之后,应用就可以接入集群进行各种操作了,但是默认的集群,没有安全保护机制,任何应用、支持JDBC的客户端,只要知道集群节点的IP地址,都可以接入集群,这造成了一定的安全风险,这对于持有敏感数据的用户,显然是无法接受的。
Ignite本身有一个简单的安全模块,提供了一个基于用户名/密码的认证机制,但是在实际业务场景中,需求往往更复杂,本文以白名单认证方式为例,讲述如何通过自定义安全插件的方式,满足自己的业务需求。
插件
Ignite有一个设计良好的模块化架构和插件机制,可以配置不同的模块,也可以自定义自己的插件。本文会介绍如何替换掉默认的安全实现。
第一步是在IgniteConfiguration
中注入一个插件,本示例采用基于XML的配置,配置如下:
<bean id="ignite" class="org.apache.ignite.configuration.IgniteConfiguration" p:gridName="mygrid"> <property name="pluginConfigurations"> <bean class="ignite.WhiteListPluginConfiguration"/> </property> </bean>
这个配置类的实现没什么特别的,只是创建一个插件提供者:
public class WhiteListPluginConfiguration implements PluginConfiguration { @Override public Class<? extends PluginProvider> providerClass() { return WhiteListPluginProvider.class; } }
插件提供者类将在启动时由IgniteKernal
初始化,可以创建支持不同接口的插件。本文对安全插件感兴趣,所以会创建GridSecurityProcessor
的实现:
public class WhiteListPluginProvider implements PluginProvider<WhiteListPluginConfiguration> { @Override public String name() { return "WhiteListSecurity"; } @Override public String version() { return "1.0.0"; } @Nullable @Override public Object createComponent(PluginContext ctx, Class cls) { if (cls.isAssignableFrom(GridSecurityProcessor.class)) { return new WhiteListSecurityProcessor(); } else { return null; } } @Override public IgnitePlugin plugin() { return new WhiteListAuthenticator(); } //all other methods are no-op }
注意这里的createComponent
方法和plugin
方法。
这个类上的其它方法,大部分都是空实现。
WhiteListSecurityProcessor
到此为止,已经在Ignite中创建和安装了安全插件,剩下的就是实现具体的认证和授权逻辑,本文只关注认证,认证通过之后会授予所有的权限。
以下是主要的代码段:
public class WhiteListSecurityProcessor implements DiscoverySpiNodeAuthenticator, GridSecurityProcessor, IgnitePlugin { //the hosts that will be allowed to join the cluster private Set<String> whitelist = new HashSet<>(); private boolean isAddressOk(Collection<String> addresses) { //return true if the address is in the whitelist } @Override public SecurityContext authenticateNode(ClusterNode node, SecurityCredentials cred) throws IgniteException { return new SecurityContext(new SecuritySubject() { @Override public SecurityPermissionSet permissions() { if (isAddressOk(node.addresses())) { return WhiteListPermissionSets.ALLOW_ALL; } else { return WhiteListPermissionSets.ALLOW_NONE; } } //all other methods are noop }); } @Override public boolean isGlobalNodeAuthentication() { //allow any node to perform the authentication return true; } @Override public void start() throws IgniteCheckedException { //load the whitelist //check that this process is running on a white listed server //if there's a problem throw new IgniteCheckedException } @Nullable @Override public IgniteSpiNodeValidationResult validateNode(ClusterNode node) { if (!isAddressOk(node.addresses())) { return new IgniteSpiNodeValidationResult(node.id(), "Access denied", "Access denied"); } else { return null; } } //all other methods are noop }
这个只是一段伪代码,具体的实现需要开发者根据自身的需求进行发挥。
start
方法会在Ignite启动时调用,因此这里是加载白名单IP地址的合适位置。这里还可以用于校验此进程是否在列出白名单的服务器上运行,如果有任何问题,都可以抛出IgniteCheckedException
异常,这会导致进程终止并输出错误信息。
当新的节点启动并尝试接入时,将按顺序调用authenticateNode
和validateNode
方法。调用authenticateNode
需要返回一个安全上下文,该安全上下文标识授予该进程的权限。为安全起见,如果IP地址不在白名单上,会返回一个ALLOW_NONE
策略。然后调用validateNode
,在这里可以获取连接节点的IP地址,并确定它是否可以加入集群。
至于有关如何创建策略列表的示例,请查看Ignite的GridOsSecurityProcessor
类。
同样,有许多需要实现的无操作方法,但是与本文的主题无关。
最后
这个只是一个简单的示例,讲述了如何定制Ignite的插件,尤其是身份认证插件。如果用于处理身份认证的节点故障,则会选择一个新的节点并恢复服务。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
面试官问你B树和B+树,就把这篇文章丢给他
原文链接:面试官问你B树和B+树,就把这篇文章丢给他 1 B树 在介绍B+树之前, 先简单的介绍一下B树,这两种数据结构既有相似之处,也有他们的区别,最后,我们也会对比一下这两种数据结构的区别。 1.1 B树概念 B树也称B-树,它是一颗多路平衡查找树。二叉树我想大家都不陌生,其实,B树和后面讲到的B+树也是从最简单的二叉树变换而来的,并没有什么神秘的地方,下面我们来看看B树的定义。 每个节点最多有m-1个关键字(可以存有的键值对)。 根节点最少可以只有1个关键字。 非根节点至少有m/2个关键字。 每个节点中的关键字都按照从小到大的顺序排列,每个关键字的左子树中的所有关键字都小于它,而右子树中的所有关键字都大于它。 所有叶子节点都位于同一层,或者说根节点到每个叶子节点的长度都相同。 每个节点都存有索引和数据,也就是对应的key和value。 所以,根节点的关键字数量范围:1 <= k <= m-1,非根节点的关键字数量范围:m/2 <= k <= m-1。 另外,我们需要注意一个概念,描述一颗B树时需要指定它的阶数,阶数表示了一个节点最多有多少个孩子节点,一般用...
- 下一篇
vue项目实践@树洞(二)
书接上文 上一篇粗略地搭建了项目,运行一下,编译通过,但是控制台上打出一个红色错误警告!报错了?!什么情况,还没做事就错了,来看看什么错! 'Locale' is defined but never used,就是说Locale这个变量没有使用。在引入UI组件库的时候,我的编辑器已经错误提示了,莫名其妙嘛。并非这个错抛得莫名其妙,而是这个错不是自己造成的。设想一下,在插件的基础上加了很复杂的逻辑,这时来一个这样莫名其妙的错,是不是很无语。这只是一个假想,绝大多数情况不会是插件带来的。不过,我还是选择自己撸代码,不去使用所谓的插件,除非使用例如Babel之类的工具。 除此之外,使用ESLint还会有更多的错误提示。比如,配置postcss.config.js的时候也会给出错误警告,我在上一篇文章给的配置文件的key使用的是双引号,它会提示使用单引号。再比如,ES推荐使用箭头函数,在某些时候没用使用箭头函数也会跑错,特别是使用插件。代码提示会抛出很多语法上的错误提示,如果开了ESLint,那就按着它的提示来培养代码编写习惯吧。 // 重新给一下postcss.config.js modu...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,CentOS8安装Elasticsearch6.8.6
- MySQL8.0.19开启GTID主从同步CentOS8
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS8安装Docker,最新的服务器搭配容器使用
- Hadoop3单机部署,实现最简伪集群
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2全家桶,快速入门学习开发网站教程
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Linux系统CentOS6、CentOS7手动修改IP地址