Pregunta

Estoy completamente nuevo en la primavera y el haber conseguido una mayoría del conocimiento que tengo del libro Primavera Recetas de Apress.

Tengo la autenticación LDAP trabajar con Spring Security dentro de una aplicación web. Me gustaría arrancar mis judías contexto de aplicación y los archivos de propiedades a partir de esta aplicación web, sin embargo, y de alguna manera externalizar ellos para que todas nuestras aplicaciones web puede hacer referencia a las mismas habas. Por eso, cuando tenemos que cambiar algo (como el ldapuser o las direcciones URL de LDAP), lo cambiamos en un lugar y el resto de las aplicaciones solo sabemos.

Actualizar He implementado recargable propiedades elásticas que se recarga cuando los archivos de propiedades que proceden son tocado. Estoy utilizando propiedades cifrados, sin embargo, es abajo es de clase I creado en la parte superior de las propiedades del muelle recargable.

ReloadingEncryptablePropertyPlaceholderConfigurer.java

package;

import java.util.Properties;
import java.util.Set;

import org.apache.commons.lang.Validate;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import org.jasypt.encryption.StringEncryptor;
import org.jasypt.util.text.TextEncryptor;
import org.jasypt.properties.PropertyValueEncryptionUtils;

import org.springframework.beans.factory.BeanDefinitionStoreException;

public class ReloadingEncryptablePropertyPlaceholderConfigurer extends ReloadingPropertyPlaceholderConfigurer {

    protected final Log logger = LogFactory.getLog(getClass());
    private final StringEncryptor stringEncryptor;
    private final TextEncryptor textEncryptor;

    public ReloadingEncryptablePropertyPlaceholderConfigurer(TextEncryptor textEncryptor) {
        super();
        logger.info("Creating configurer with TextEncryptor");
        Validate.notNull(textEncryptor, "Encryptor cannot be null");
        this.stringEncryptor = null;
        this.textEncryptor = textEncryptor;
    }

    public ReloadingEncryptablePropertyPlaceholderConfigurer(StringEncryptor stringEncryptor) {
        super();
        logger.info("Creating configurer with StringEncryptor");
        Validate.notNull(stringEncryptor, "Encryptor cannot be null");
        this.stringEncryptor = stringEncryptor;
        this.textEncryptor = null;
    }

    @Override
    protected String convertPropertyValue(String originalValue) {
        if (!PropertyValueEncryptionUtils.isEncryptedValue(originalValue)) {
            return originalValue;
        }
        if (this.stringEncryptor != null) {
            return PropertyValueEncryptionUtils.decrypt(originalValue, this.stringEncryptor);
        }
        return PropertyValueEncryptionUtils.decrypt(originalValue, this.textEncryptor);
    }

    @Override
    protected String parseStringValue(String strVal, Properties props, Set visitedPlaceholders) throws BeanDefinitionStoreException {
        return convertPropertyValue(super.parseStringValue(strVal, props, visitedPlaceholders));
    }
}

Y aquí es cómo lo uso en mi securityContext.xml

<bean id="securityContextSource" class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
    <constructor-arg value="ldaps://ldapserver" />
    <property name="urls" value="#{ldap.urls}" />
</bean>

<bean id="timer" class="org.springframework.scheduling.timer.TimerFactoryBean">
    <property name="scheduledTimerTasks">
        <bean id="reloadProperties" class="org.springframework.scheduling.timer.ScheduledTimerTask">
            <property name="period" value="1000"/>
            <property name="runnable">
                <bean class="ReloadConfiguration">
                    <property name="reconfigurableBeans">
                        <list>
                            <ref bean="configproperties"/>
                        </list>
                    </property>
                </bean>
            </property>
        </bean>
    </property>
</bean>

<bean id="configproperties" class="ReloadablePropertiesFactoryBean">
    <property name="location" value="classpath:ldap.properties"/>
</bean>

<bean id="ldapPropertyConfigurer" class="ReloadingEncryptablePropertyPlaceholderConfigurer">
    <constructor-arg ref="configurationEncryptor" />
    <property name="ignoreUnresolvablePlaceholders" value="true" />
    <property name="properties" ref="configproperties"/>
</bean>

<bean id="jasyptConfig" class="org.jasypt.encryption.pbe.config.SimpleStringPBEConfig">
    <property name="algorithm" value="PBEWithMD5AndTripleDES" />
    <property name="password" value="########" />
</bean>

<bean id="configurationEncryptor" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor">
    <property name="config" ref="jasyptConfig" />
</bean>
¿Fue útil?

Solución

¿Qué hay de:

  • Escribir un método que devuelve una lista de servidores LDAP - lectura de una tabla de base de datos o archivos de propiedad
  • exponga este wethod a través de JNDI y lo utilizan para inyectar una lista de los servidores en su configuración de primavera
  • Si necesita los servidores LDAP se actualicen de forma dinámica que podría haber un sondeo de trabajo para los cambios de forma periódica o bien tienen una página web de administración o frijol jmx para activar la actualización. Tenga cuidado de isses concurrencia de estos dos métodos (algo que leer la lista mientras se está actualizando)

Otros consejos

No sería la primavera de Seguridad? Se puede tratar con LDAPs. Y si lo hace un servicio de seguridad que todo el mundo utiliza, no que sea la forma de manejarlo?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top