Domanda

Sono nuovo di zecca in primavera e hanno ottenuto la maggioranza delle conoscenze devo dal libro Primavera Ricette da Apress.

Ho l'autenticazione LDAP lavorare con Primavera di sicurezza all'interno di una webapp. Vorrei strappare i miei fagioli contesto di applicazione e file oggetti di questo webapp, tuttavia, e in qualche modo li esternare in modo che tutti i nostri webapps possono fare riferimento gli stessi fagioli. Così, quando abbiamo bisogno di cambiare qualcosa (come il ldapuser o gli URL LDAP), si cambia in un posto e il resto delle applicazioni appena conosciamo.

Aggiorna Ho implementato Reloadable Primavera Proprietà che viene ricaricare le proprietà quando i file da cui provengono sono toccato. Sto usando le proprietà crittografate, tuttavia, così in basso è di classe che ho creato in cima quelli Reloadable primavera Proprietà.

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

Ed ecco come lo uso nel mio 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>
È stato utile?

Soluzione

Come su:

  • Scrivi metodo che restituisce una lista di server LDAP - lettura di un file delle tabelle del database o di proprietà
  • esporre questo wethod via JNDI e usarlo per iniettare un elenco dei server nel vostro config primavera
  • Se avete bisogno di server LDAP per essere aggiornati in modo dinamico si potrebbe avere un sondaggio di lavoro per le modifiche periodicamente oppure avere una pagina web di amministrazione o di fagioli JMX per attivare l'aggiornamento. Fare attenzione di isses concorrenza per entrambi questi metodi (qualcosa di lettura della lista, mentre si sta aggiornando)

Altri suggerimenti

Non sarebbe Primavera di sicurezza? Si può trattare con LDAPS. E se si rendono servizio one di sicurezza che tutti usano, non che essere il modo di gestirlo?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top