Při vývoji aplikací ve Springu jste jistě narazili na problém nasazení do různých prostředí. Pravděpodobně jste to řešili vytvořením samostatných buildů. Ovšem ne vždy je to potřeba. Proč nenechat konfiguraci na adminovi? Existuje jednoduché a elegantní řešení jménem BeanReferenceFactoryBean.
BeanReferenceFactoryBean využijete zejména, nastavujete-li specifická prostředí, jako je TaskExecutor pro Scheduling, transakční manažer, autentizaci atd.
Představte si například situaci, kdy v properties vaší aplikace potřebujete nastavit, zda se Spring Security bude autentizovat vůči databázi nebo vůči LDAPu.
Jak na to?
Nejdříve nastavte v properties takovýto klíč:
myApplication.authentication.provider=ldap
Target beana libovolného jména definovaného v properties bude díky BeanReferenceFactoryBean dostupná vždy pod jediným a předem známým id.
<bean id="authenticationProvider" class="org.springframework.beans.factory.config.BeanReferenceFactoryBean">
<property name="targetBeanName">
<value>${myApplication.authentication.provider}AuthenticationProvider</value>
</property>
</bean>
Do authentication-manageru nainjektujeme beanu authenticationProvider, jejíž target beana je zvolena právě na základě konfigurace v properties.
<sec:authentication-manager> <sec:authentication-provider ref="authenticationProvider"/> </sec:authentication-manager>
Pro úplnost ještě uvádím nástin konfigurace Spring Security vůči databázi a LDAP.
<bean id="dbAuthenticationProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider" lazy-init="true"> <property name="userDetailsService" ref="userDetailsService" /> </bean>
Lazy-init je nastaveno na true, protože pokud si vyberete autentizaci vůči databázi, tak nebudete konfigurovat LDAP a naopak. S nevalidním nastavením by vám pak vůbec nenaběhl aplikační kontext.
<bean id="ldapAuthenticationProvider" class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider" lazy-init="true"> <!-- configuration of LDAP --> </bean>
Místo nového buildu teď stačí pro změnu konfigurace jen upravit nastavení v properties a restartovat aplikační server.