Spring Data Geode 1.0.0.INCUBATING-RELEASE 发布

工程 | John Blum | 2016年11月10日 | ...

我代表SpringApache Geode社区,非常高兴地宣布发布用于Apache Geode 1.0.0-incubatingSpring Data

您可以从Maven Central获取二进制文件,方法是在应用程序的Maven POM或Gradle构建文件中包含以下依赖项...

Maven

<dependency>
  <groupId>org.springframework.data</groupId>
  <artifactId>spring-data-geode</artifactId>
  <version>1.0.0.INCUBATING-RELEASE</version>
</dependency>

Gradle

compile 'org.springframework.data:spring-data-geode:1.0.0.INCUBATING-RELEASE'

包含spring-data-geode依赖项将传递性地引入所有必需的Apache Geode工件,因此您现在可以开始构建使用Apache GeodeSpring应用程序。

注意

我再次更改了版本限定符,方法是删除APACHE-GEODE限定符并简化为INCUBATING-RELEASE。一旦Apache Geode毕业,INCUBATING限定符也将消失,版本号将简单地变为major.minor.maint.[M#|RC#|RELEASE]

新增功能

Spring Data Geode 1.0.0.INCUBATING-RELEASEApache 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,也适用于应用程序的安全配置。

如何保护Apache Geode

在没有Spring (Data Geode)的情况下,Apache Geode提供了自己的安全配置选项。

一种选择是实现Apache Geode SecurityManager接口,并设置相应的Geode security-manager(系统)属性为完整限定类名。您可以此处查看此示例。

但是,使用属性引用FQCN严重限制了您在托管环境或测试上下文中配置SecurityManager的方式。根据我的反馈,这将在Geode的后续版本中得到解决

另一种选择是使用Apache Geodesecurity-shiro-init(系统)属性来指定位于Apache Shiro支持的指定资源路径中的INI配置文件。但是,这有两个限制。

首先,Apache Geode目前仅支持classpath:资源说明符(也正在由Geode工程团队解决)。其次,无论多么标准,都需要学习另一种配置文件格式,在我看来,这并不比XML好多少。

当然,Apache ShiroSpring上下文中运行时试图减轻痛苦,方法是提供此功能。但是,仍然存在太多样板配置逻辑需要改进。

如何使用Spring (Data Geode)保护Apache Geode

本着使Apache Geode尽可能快速易于使用的精神(请参阅我的上一篇博文),我一直在与Geode工程团队紧密合作,以改进初始设计,并通过采用Spring FrameworkSpring Boot推广的许多基本API和框架设计概念,真正使集成安全成为Spring Data Geode中的一等公民。

因此,我为您提供了SDG的新基于注解的配置模型中的@EnableSecurity注解。您可以使用此注解以多种方式配置Apache Geode的安全功能。

SecurityManager 类名引用

您仍然可以使用以下方法通过其完整限定类名引用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实现将负责在构造时加载所有安全身份验证/授权详细信息;这并不是很理想。

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

SecurityMangerProxyApache 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 构建对象后,使用 BeanFactoryLocatorSpring 容器自动装配。实际上非常巧妙。

您可以在 RI 中查看完整的示例配置 此处。这还需要将 useBeanFactoryLocator 属性设置为 true 在 Geode 服务器、Spring Boot 应用程序类上,如上例所示。

Apache Shiro INI 配置文件

也许您不希望不必要地将应用程序代码耦合到 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:)。

此完整示例配置可以在 此处 查看。

Apache Shiro Realms

但是,作为应用程序开发人员,您真正想要做的是在 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 的多个示例配置 此处

下一步

我们涵盖了很多内容,但仍然有更多工作要做。具体来说,我打算做以下工作…

  • Apache Geode集成安全 框架与 Spring Security 集成。
  • 改进 Spring Boot 对 SDG 存储库 的自动配置支持,以及使用 Spring缓存抽象 自动配置 Apache Geode 作为 缓存提供程序
  • 扩展 SDG 的注解配置支持,以根据实体和/或 存储库 bean 定义动态创建 Geode 缓存 区域

还有很多工作正在进行中,敬请期待。

其他发行亮点

  • 将基本 Java 版本设置为 Java 8
  • 升级到 Spring Framework 4.3.4.RELEASE。
  • 升级到 Spring Data Commons 1.12.5.RELEASE。

有关更多详细信息,请参阅 更改日志

结论

与往常一样,非常欢迎您的反馈,您可以在 JIRAStackOverflow 上联系我们。

谢谢大家!祝您编码愉快。

获取 Spring 电子邮件简报

关注 Spring 电子邮件简报

订阅

抢先一步

VMware 提供培训和认证,助您快速提升。

了解更多

获取支持

Tanzu Spring 在一个简单的订阅中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看全部