抢先一步
VMware 提供培训和认证,助您快速提升。
了解更多我代表Spring和Apache Geode社区,非常高兴地宣布发布用于Apache Geode 1.0.0-incubating的Spring Data。
您可以从Maven Central获取二进制文件,方法是在应用程序的Maven POM或Gradle构建文件中包含以下依赖项...
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-geode</artifactId>
<version>1.0.0.INCUBATING-RELEASE</version>
</dependency>
compile 'org.springframework.data:spring-data-geode:1.0.0.INCUBATING-RELEASE'
包含spring-data-geode
依赖项将传递性地引入所有必需的Apache Geode工件,因此您现在可以开始构建使用Apache Geode的Spring应用程序。
我再次更改了版本限定符,方法是删除
APACHE-GEODE
限定符并简化为INCUBATING-RELEASE
。一旦Apache Geode毕业,INCUBATING
限定符也将消失,版本号将简单地变为major.minor.maint.[M#|RC#|RELEASE]
。
Spring Data Geode 1.0.0.INCUBATING-RELEASE 和Apache Geode 1.0.0-incubating 版本在几个方面都具有重大意义。
首先,这标志着Apache Geode在Apache软件基金会(ASF)内的第一个正式GA版本。这不仅是表明Geode成熟度的巨大一步,Geode植根于十多年的生产经验,即Pivotal GemFire,而且还加速了它作为ASF内顶级项目(TLP)的毕业。
但这还不是全部!
此版本还通过引入一个新的集成安全框架(一些技术细节此处)对Apache Geode的安全模型进行了重大更改,该框架不仅包括安全传输(即SSL),还包括身份验证和授权。
这很重要,因为Apache Geode是为数不多的提供无需企业许可证即可获得安全的开源IMDG选项之一!
此新功能的最大优点之一是它是一个框架,允许插入不同的安全提供程序。Geode开箱即用地构建在Apache Shiro之上,这提供了一种熟悉且可靠的方式来配置不仅适用于Geode,也适用于应用程序的安全配置。
在没有Spring (Data Geode)的情况下,Apache Geode提供了自己的安全配置选项。
一种选择是实现Apache Geode SecurityManager接口,并设置相应的Geode security-manager
(系统)属性为完整限定类名。您可以此处查看此示例。
但是,使用属性引用FQCN严重限制了您在托管环境或测试上下文中配置SecurityManager
的方式。根据我的反馈,这将在Geode的后续版本中得到解决。
另一种选择是使用Apache Geode的security-shiro-init
(系统)属性来指定位于Apache Shiro支持的指定资源路径中的INI配置文件。但是,这有两个限制。
首先,Apache Geode目前仅支持classpath:
资源说明符(也正在由Geode工程团队解决)。其次,无论多么标准,都需要学习另一种配置文件格式,在我看来,这并不比XML好多少。
当然,Apache Shiro在Spring上下文中运行时试图减轻痛苦,方法是提供此功能。但是,仍然存在太多样板配置逻辑需要改进。
本着使Apache Geode尽可能快速且易于使用的精神(请参阅我的上一篇博文),我一直在与Geode工程团队紧密合作,以改进初始设计,并通过采用Spring Framework和Spring Boot推广的许多基本API和框架设计概念,真正使集成安全成为Spring Data Geode中的一等公民。
因此,我为您提供了SDG的新基于注解的配置模型中的新@EnableSecurity
注解。您可以使用此注解以多种方式配置Apache Geode的安全功能。
您仍然可以使用以下方法通过其完整限定类名引用Geode SecurityManager
实现...
package example;
class ExampleSecurityManager
implements org.apache.geode.security.SecurityManager {
...
}
@CacheServerApplication(name = "ClassNameExample")
@EnableSecurity(securityManagerClassName = "example.ExampleSecurityManager")
class ExampleApplication {
...
}
可以在SDG 联系人应用程序 RI中看到更详细的示例,此处。
但是,您必须提供一个默认的无参数构造函数,并且您的Geode SecurityManager
实现将负责在构造时加载所有安全身份验证/授权详细信息;这并不是很理想。
另一种选择是创建一个实现Geode SecurityManager
接口的Proxy
,该接口委托给由Spring容器或其他托管环境(如Pivotal CloudFoundry)配置和注入的实际底层Geode SecurityManager
。
可以在RI中看到一个这样的Proxy
实现此处,配置如下...
@CacheServerApplication(name = "ProxyExample")
@EnableSecurity(securityManagerClassName =
"example.app.geode.security.SecurityManagerProxy",
useBeanFactoryLocator = true)
class ExampleApplication {
...
@Bean
JdbcSecurityRepository securityRepository(JdbcTemplate template) {
return new JdbcSecurityRepository(template);
}
@Bean
SimpleSecurityManager securityManager(
SecurityRepository<User> securityRepository) {
return new SimpleSecurityManager(securityRepository);
}
}
SecurityMangerProxy
由 Apache Geode 在缓存初始化期间构建。Spring 容器会找到 SimpleSecurityManager bean 定义并将其注入到 SecurityManagerProxy
中。
SecurityManagerProxy
的工作原理是利用另一个 Spring 功能,即 BeanFactoryLocator,如 参考指南(以及 此处)中所述,SDG 使用它来配置和自动装配在 Spring 容器外部构建和初始化的对象,例如 Apache Geode 构建的对象。
这在以下情况下非常有用:应用程序对象(例如 CacheLoader)可能已在 Geode 的原生 cache.xml
配置文件中定义,并且需要自动装配 Spring 容器中定义的 bean(例如 DataSource
)。这对于在 Geode(系统)属性中引用的对象(如 SecurityManager
)也适用。
SecurityManagerProxy
必须 扩展 LazyWiringDeclarableSupport 类,这使得 Proxy
能够在 Geode 构建对象后,使用 BeanFactoryLocator
由 Spring 容器自动装配。实际上非常巧妙。
您可以在 RI 中查看完整的示例配置 此处。这还需要将 useBeanFactoryLocator
属性设置为 true 在 Geode 服务器、Spring Boot 应用程序类上,如上例所示。
也许您不希望不必要地将应用程序代码耦合到 Geode 的专有类和接口,例如 SecurityManager
。也许您只是想充分利用 Apache Shiro 的安全框架。
一种方法是创建一个 Apache Shiro INI 配置文件,并在 @EnableSecurity
注解中引用它,如下所示…
@CacheServerApplication(name = "ProxyExample")
@EnableSecurity(shiroIniResourcePath = "my-shiro.ini")
class ExampleApplication {
...
}
同样,Apache Shiro INI 文件必须位于类路径上。由于当前 Apache Geode 的 限制,无法使用其他资源说明符(例如 file:
或 url:
)。
此完整示例配置可以在 此处 查看。
但是,作为应用程序开发人员,您真正想要做的是在 Spring 容器中将 Apache Shiro Realms
定义为 Spring bean,以访问应用程序保护 Apache Geode 所需的安全元数据,并让 Spring 完成所有工作。
好的,SDG 也可以为您做到这一点。例如…
@CacheServerApplication(name = "RealmExample")
@EnableSecurity
class ExampleApplication {
@Bean
PropertiesRealm shiroRealm() {
PropertiesRealm propertiesRealm = new PropertiesRealm();
propertiesRealm.setResourcePath("classpath:shiro.properties");
propertiesRealm.setPermissionResolver(new GeodePermissionResolver());
return propertiesRealm;
}
}
就是这样;这就是您需要做的全部。
请注意,Shiro PropertiesRealm 使用 GeodePermissionResolver
来解析 Geode 权限。此外,您可以选择指定任何您选择的资源路径;您不限于仅使用 classpath:
。
您也可以自由定义应用程序用于访问其安全元数据的 Shiro 提供的任何 Realms
(例如 JDBC、JNDI、LDAP 等)。
如果您定义了多个 Shiro Realm
,您甚至可以使用 Spring 的 @Order
注解对 Realm
bean 定义进行排序,如下所示…
@CacheServerApplication(name = "OrderedMultiRealmExample")
@EnableSecurity
class ExampleApplication {
@Bean
@Order(1)
IniRealm iniRealm() {
IniRealm iniRealm = new IniRealm("classpath:partial-shiro.ini");
iniRealm.setPermissionResolver(new GeodePermissionResolver());
return iniRealm;
}
@Bean
@Order(2)
PropertiesRealm propertiesRealm() {
PropertiesRealm propertiesRealm = new PropertiesRealm();
propertiesRealm.setResourcePath("classpath:partial-shiro.properties");
propertiesRealm.setPermissionResolver(new GeodePermissionResolver());
return propertiesRealm;
}
}
Realm
的排序顺序是 Apache Shiro 身份验证序列 中使用的 身份验证策略 的一个重要因素。
您可以在 RI 中查看使用 Shiro Realms
的多个示例配置 此处。
我们涵盖了很多内容,但仍然有更多工作要做。具体来说,我打算做以下工作…
还有很多工作正在进行中,敬请期待。
有关更多详细信息,请参阅 更改日志。
与往常一样,非常欢迎您的反馈,您可以在 JIRA 或 StackOverflow 上联系我们。
谢谢大家!祝您编码愉快。