Frage

Ich bin Marke im Frühling neuer Prügel und hat eine Mehrheit der Kenntnisse, die ich aus dem Frühlings-Rezepten Buch von Apress habe bekommen.

Ich habe die LDAP-Authentifizierung mit Spring Security arbeitet innerhalb einer Webapp. Ich möchte meine Anwendungskontext Bohnen und Eigenschaften von Dateien aus diesem Webapp auszureißen, aber, und sie irgendwie externalisieren, so dass alle unsere Webapps die gleichen Bohnen verweisen können. Also, wenn wir etwas ändern müssen (wie die ldapuser oder den LDAP-URLs), ändern wir es an einem Ort und der Rest der Anwendungen nur wissen.

UPDATE Ich habe implementiert wiederbeladbare Federeigenschaften dem Nachladen Eigenschaften, wenn die Dateien, die sie kommen aus sind berührt. Ich bin mit verschlüsselten Eigenschaften jedoch so unter Klasse I ist auf der Oberseite der wiederbeladbare Federeigenschaften diejenigen erstellt.

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

Und hier ist, wie ich es verwende in meinem 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>
War es hilfreich?

Lösung

Wie wäre:

  • ein Verfahren zu schreiben, das gibt eine Liste von LDAP-Servern - von einer Lesung Datenbanktabelle oder Eigenschaftsdateien
  • Setzen Sie dieses wethod über jndi und es verwenden, um eine Liste der Server in die Feder Config
  • zu injizieren
  • Wenn Sie die LDAP-Server müssen aufgefrischt werden dynamisch könnten Sie einen Job Umfrage für Änderungen in regelmäßigen Abständen haben oder sonst eine Admin Webseite oder JMX-Bean haben das Update auslösen. Achten Sie auf die Parallelität isses für diese beiden Methoden (etwas Lesen der Liste, während Sie aktualisieren)

Andere Tipps

Wäre das nicht Spring Security sein? Es kann mit LDAPs beschäftigen. Und wenn Sie es einen Sicherheitsdienst zu machen, dass jeder benutzt, würde das nicht die Art und Weise, es zu verwalten?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top