Frage

Ich baue eine Web-Anwendung mit Streifen und Frühling. Es muss eine Anmeldung / Authentifizierung Funktion haben. Gerade jetzt speichere ich Benutzerinformationen getrennt von Benutzerdaten in der Datenbank. Mein Benutzermodell enthält nicht die Anmeldeinformationen wie ich will nicht vorbei um wertvolle Passwörter werden.

Frühling verwaltet alle meine DAOs.

Nun, ich bin der Umsetzung eines nicht-Container basierten Sicherheitssystem. Ich speichere den sha-2 Hash des Passworts und einen Vergleich auf dem Kennwort durchführen, die in der Form gegen vorgelegt wurden, was in der Datenbank gespeichert ist. Dieser Vergleich wurde getestet und funktioniert. Ich versuche, herauszufinden, wie diese Sache zusammen verdrahten. Im Moment habe ich einen LoginActionBean, der die Anmeldeanforderungen auffängt und verwendet eine „Password“ Singletons, die eine UserDAO intern verwendet Anmeldeinformationen abzurufen und auszuführen Vergleich gegen die Parameter vorgelegt. Mein Frühling Bohne ist:

<bean id="passwordSerivce" class="com.example.store.authentication.PasswordService" factory-method="getInstance">
    <property name="userDAO" ref="userDAO"/>
</bean>

Aber es dann der Password Singletons braucht ein:

public void setUserDAO(UserDAO userDAO) { ...}

Methode, die wirklich keinen Sinn in einem Singleton machen (UserDAO ist eine Schnittstelle).

Ich bin auf der Suche nach einem richtigen Design. Ich habe gelesen, dass ServiceLocators der Grund ist Frühling erfunden wurde. Irgendwelche Gedanken?

Ich würde auch gerne wissen, wie sonst kann ich diesen Entwurf. Ich habe eine ActionBean, die aufgerufen wird, wenn der Benutzer klickt auf „Login“, aber wie kann ich eigentlich authentifizieren. Muss ich den Authentifizierungsdienst in den Bohnen injizieren? Lese ich ein Singleton schaffen, dass jemand anrufen können? Muss ich eine generische Schnittstelle, die die LoginAcionBean verwendet, die Frühling einspritzt? Wenn ich nicht Frühling verwenden, wie wäre es getan werden?

War es hilfreich?

Lösung

  1. Ich verstehe nicht, warum es keinen Sinn, die userDao zu injizieren.

  2. Ich verstehe nicht, warum Ihr xml verwendet Fabrik-method = "getInstance"; Sie können alle Instanz Sachen und Singletons Sachen wegzuwerfen; Frühling wird eine einzelne Instanz der Passwort-Service-Klasse instanziiert und injizieren sie in jedoch viele Klassen es brauchen, und sie werden alle die gleiche Instanz erhalten. So Frühjahr ein Singleton für Sie erstellt. Die Passwort-Service-Klasse kann eine einfache pojo sein. Ähnliches gilt für die userDao Umsetzung.

Ich rate auch betrachten, das Verständnis und die Verwendung der Feder Anmerkungen. Grundsätzlich verwenden Sie @Service auf die Klasse, die injiziert werden, dann verwenden @Autowired auf der Setter in der Klasse, wo es injiziert wird. Sie müssen auch etwas zu Ihrer XML-Konfigurationsdatei hinzufügen auf der Anmerkung Sachen zu machen.

Andere Tipps

auf die obige Antwort Hinzufügen, nur Konstruktor Injektion verwenden, wenn Sie nicht über einen Setter für die DAO wollen:

<bean id="passwordSerivce" class="...PasswordService">
   <constructor-arg ref="userDAO"/>
</bean>

Es sei denn, die Bohne nicht eine Klasse, die du kontrollierst, können Sie es nicht ein Singleton machen müssen, Frühling wird standardmäßig das tun.

Ich persönlich bin kein Fan von Anmerkungen.

Meine Lösung war, eine Schnittstelle mit einer „beglaubigen“ Methode zu haben. Dann eine Service-Klasse erstellen, die die Schnittstelle mit einem Konstruktor implementiert, die in einer UserDAO Aufgabe übernimmt. Auf diese Weise wird das Objekt, das den Dienst erfordert keine Instanziierung durchführen (es durch die Feder getan) und ist nicht bewusst, was zugrunde liegende Implementierung durchgeführt wird (LDAP, SSO, einfaches Passwort Vergleich, etc). Scheint die Aufgabe zu erledigen: P

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