Frage

Die Absicht hier ist mit verschleierten Passwörtern für Ressourcen zu behandeln.

Wir haben einen Berater, die Anrufe zu setPassword und entschlüsselt das Argument ab.

Wir haben eine Vorlage einrichten, die ein wenig wie folgt aussieht:

<bean id="pwAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
   <property name="advice"><bean class="our.advice.bean.class"/></property>
   <property name="mappedName" value="setPassword"/>
</bean>
<bean id="passwordHandlerTemplate" class="org.springframework.aop.framework.ProxyFactoryBean" abstract="true">
   <property name="interceptorNames"><list><value>pwAdvisor</value></list></property>
</bean>

Ich bin unklar über die genaue Syntax, es zu benutzen. Der offensichtlichste Weg ist:

<bean id="myPasswordProtectedThing" parent="passwordHandlerTemplate">
   <property name="target">
      <bean class="the.target.class.name">
         <property name="password" value="encrypted garbage"/>
      </bean>
    </property>
 </bean>

Aber das funktioniert nicht richtig, da das Passwort Eigentum an die innere Bohne angelegt wird, was bedeutet, dass der Berater seine Arbeit nicht aufzuwickeln tun.

Nun, was ist das:

<bean id="myPasswordProtectedThing" parent="passwordHandlerTemplate">
   <property name="target"><bean class="the.target.class.name"/></property>
   <property name="password" value="encrypted garbage"/>
</bean>

Nein. Frühling wirft der ProxyFactoryBean kein Passwort Eigenschaft. Und natürlich ist es nicht. Die Sache, die das Passwort Eigenschaft hat, ist die Sache der Fabrik Bohne schafft .

Bueller?

War es hilfreich?

Lösung

Mein erster Versuch war schlecht, aber ich war in Eile. Ich entschuldige mich. Jetzt denke ich, ich weiß, wie es sollte funktionieren, weil ich glaube, ich realisiert habe, was Sie selbst wollen.

Ich begann mit einer Credential-Klasse (Anmerkung: keine Schnittstelle):


package aop;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Credential
{
   private static final String DEFAULT_USERNAME = "username";
   private static final String DEFAULT_PASSWORD = "password";

   private String username;
   private String password;

   public static void main(String[] args)
   {
      Credential cred1 = new Credential("foo", "bar");
      System.out.println("created using new: " + cred1);

      ApplicationContext context = new ClassPathXmlApplicationContext("classpath:aop-context.xml");
      Credential cred2 = (Credential) context.getBean("credential");

      System.out.println("created using app context: " + cred2);

      String password = ((args.length > 0) ? args[0] : "baz");
      cred2.setPassword(password);

      System.out.println("initialized using setter: " + cred2);      
   }

   public Credential()
   {
      this(DEFAULT_USERNAME, DEFAULT_PASSWORD);
   }

   public Credential(String username, String password)
   {
      this.setUsername(username);
      this.setPassword(password);
   }

   public String getUsername()
   {
      return username;
   }

   public void setUsername(String username)
   {
      this.username = username;
   }

   public String getPassword()
   {
      return password;
   }

   public void setPassword(String password)
   {
      this.password = password;
   }


   public String toString()
   {
      return new StringBuilder().append("Credential{").append("username='").append(username).append('\'').append(", password='").append(password).append('\'').append('}').toString();
   }
}

Ich habe eine Decryptor Schnittstelle:


package aop;

public interface Decryptor
{
   String decrypt(String encrypted);
}

Und ein DecryptorImpl:


package aop;

public class DecryptorImpl implements Decryptor
{
   public static final String DEFAULT_DECRYPTED_VALUE = " - not secret anymore";

   public String decrypt(String encrypted)
   {
      // Any transform will do; this suffices to demonstrate
      return encrypted + DEFAULT_DECRYPTED_VALUE;
   }
}


Ich brauchte DecryptorAdvice Spring MethodBeforeAdvice zu implementieren:



package aop;

import org.springframework.aop.MethodBeforeAdvice;

import java.lang.reflect.Method;

public class DecryptionAdvice implements MethodBeforeAdvice
{
   private Decryptor decryptor;


   public DecryptionAdvice(Decryptor decryptor)
   {
      this.decryptor = decryptor;
   }

   public void before(Method method, Object[] args, Object target) throws Throwable
   {
      String encryptedPassword = (String) args[0];

      args[0] = this.decryptor.decrypt(encryptedPassword);
   }
}

Und ich verdrahtet sie zusammen in einem AOP-context.xml. (Wenn Sie mir sagen, wie XML erhalten angezeigt werden, werde ich es posten.) Beachten Sie die passwordDecryptionAdvisor. Es passt nur die setPassword Methode

Der interessante Teil passiert, wenn ich es laufen. Hier ist, was ich in der Konsole sehen:


created using new: Credential{username='foo', password='bar'}
created using app context: Credential{username='stackoverflow', password='encrypted-password'}
initialized using setter: Credential{username='stackoverflow', password='baz - not secret anymore'}

Was sagt mir, ist:

  1. Wenn ich ein Objekt mit neuen schaffen es nicht unter Spring Kontrolle, Beratung wird nicht angewendet.
  2. Wenn ich setPassword im Ctor nennen bevor der App Kontext initialisiert, Beratung wird nicht angewendet.
  3. Wenn ich setPassword in meinem Code nennen nachdem der App Kontext initialisiert, Beratung angewendet wird.

Ich hoffe, das Ihnen helfen kann.

Andere Tipps

Vielleicht haben Sie die Vorbearbeitungsmethode Rat wollte das verschlüsselte Passwort String verwenden, die in die setPassword Methode übergeben wird. Sie möchten, dass entschlüsseln und haben die empfohlene Klasse eine entschlüsselte Version.

Ich sehe auch keinen Proxy-Schnittstelle in Ihrem Proxy-Werk eingestellt. „Spring in Aktion“, sagt „... ein Proxy mit Schnittstellen Erstellen über proxying Klassen begünstigt ...“ Proxying Klassen die Ausnahme sein sollten, nicht die Regel.

Ihre Beratung Klasse veröffentlichen.

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