領先一步
VMware 提供培訓和認證,助您加速進步。
瞭解更多我謹代表Spring和Apache Geode社群,非常高興和激動地宣佈Spring Data for Apache Geode 1.0.0-incubating 已釋出。
您可以透過在Maven POM或Gradle構建檔案中新增以下依賴項,從Maven Central獲取這些庫...
<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 Software Foundation (ASF) 內部的Apache Geode首次正式GA釋出。這不僅標誌著Geode的成熟,它源於十多年的生產經驗(曾是Pivotal GemFire),更是加速其在ASF內部成為頂級專案(TLP)的關鍵一步。
但,這還不是全部!
此次釋出還包含了對Apache Geode安全模型的重要更新,引入了一個全新的整合安全框架(一些技術細節在此),該框架不僅包括安全傳輸(如SSL),還支援身份驗證和授權。
這很重要,因為Apache Geode是少數幾個提供安全功能而無需企業許可的OSS 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工程團隊也在解決這個問題)。其次,學習另一種配置檔案格式,無論它有多麼標準, IMO,都和XML一樣糟糕。
當然,Apache Shiro試圖透過提供這個來緩解在Spring上下文中執行時的痛苦。但是,仍然有太多冗餘的配置邏輯有待改進。
本著讓Apache 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 {
...
}
更詳細的示例可以在SDGContacts Application RI中此處找到。
但是,您必須提供一個預設的無參建構函式,並且您的Geode SecurityManager實現將負責在構造時載入所有安全身份驗證/授權詳細資訊;這並不理想。
另一種選擇是建立一個實現Geode SecurityManager介面的Proxy,它委託給實際的、底層的Geode SecurityManager,該管理器在Spring容器或PivotalCloudFoundry等託管環境中配置並注入。
一個這樣的Proxy實現可以在RI此處找到,並按如下方式配置...
@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——來工作,如參考指南(以及此處)中所述,用於配置和自動裝配在Spring容器外部構建和初始化的物件,例如由Apache Geode構建的物件。
這在應用程式物件(例如CacheLoader)在Geode的本地cache.xml配置中定義,並且需要與Spring容器中定義的bean(例如DataSource)進行自動裝配的情況下非常有用。這也適用於Geode(系統)屬性中引用的物件,例如SecurityManager。
SecurityManagerProxy必須繼承LazyWiringDeclarableSupport類,這使得Proxy可以在Geode構建物件後,使用BeanFactoryLocator被Spring容器自動裝配。這確實非常巧妙。
您可以在RI此處看到完整的示例配置。這還需要在Geode Server、Spring Boot應用程式類上將useBeanFactoryLocator屬性設定為true,這在上面的示例中也有顯示。
也許您不想不必要地將應用程式程式碼與Geode的專有類和介面(如SecurityManager)耦合。也許您只是想充分利用Apache Shiro`s安全框架。
一種方法是建立一個Apache Shiro INI配置檔案,並在@EnableSecurity註解中像這樣引用它...
@CacheServerApplication(name = "ProxyExample")
@EnableSecurity(shiroIniResourcePath = "my-shiro.ini")
class ExampleApplication {
...
}
同樣,Apache Shiro INI檔案必須位於類路徑上。由於Apache Geode當前存在限制,因此無法使用其他資源說明符(例如file:或url:)。
完整的示例配置可以在此處找到。
然而,作為應用程式開發人員,您真正想要做的只是在Spring容器中將Apache Shiro Realm定義為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提供的任何Realm(例如JDBC、JNDI、LDAP等),您的應用程式使用這些Realm來訪問其安全元資料。
如果您定義了多個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 Realm的多個示例配置。
我們涵蓋了很多內容,但仍然有更多工作要做。具體來說,我打算做以下事情...
還有更多內容正在進行中,敬請期待。
請參閱更改日誌以獲取更多詳細資訊。
一如既往,我們非常歡迎您的反饋,您可以透過JIRA或StackOverflow與我們聯絡。
謝謝大家!編碼愉快。