Domanda

Sto costruendo un'applicazione web utilizzando Stripes e Spring. Si ha bisogno di avere una funzione di login / autenticazione. In questo momento mi memorizzare le informazioni utente separato dalle credenziali utente nel database. Il mio modello User non contiene le credenziali come io non voglio essere passando intorno password di valore.

Spring gestisce tutte di mio DAO.

Ora, io sono l'attuazione di un sistema di sicurezza basato non-contenitore. I memorizzare l'hash SHA-2 della password ed eseguire un confronto sulla password che è stata presentata in forma contro ciò che è memorizzato nel database. Questo confronto è stato testato e funziona. Sto cercando di capire come collegare questa cosa insieme. In questo momento ho un LoginActionBean che cattura le richieste di accesso e utilizza un Singleton "PasswordService" che utilizza un UserDAO internamente per recuperare le credenziali ed effettuare il confronto contro i parametri presentati. Il mio fagiolo primavera è:

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

Ma poi il Singleton PasswordService ha bisogno di una:

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

metodo che in realtà non ha senso in un Singleton (UserDAO è un'interfaccia).

Sto cercando una corretta progettazione. Ho letto che ServiceLocators sono il motivo è stato inventato primavera. Ogni pensiero?

Vorrei anche sapere in quale altro modo posso progettare questo. Ho un ActionBean che viene chiamato quando l'utente fa clic su "Login", ma come faccio io in realtà l'autenticazione. Ho iniettare il servizio di autenticazione nella fava? Faccio a creare un Singleton che chiunque può chiamare? Ho un interfaccia generica che il LoginAcionBean utilizza inietta che primavera? Se non stavo usando primavera, come sarebbe essere fatto?

È stato utile?

Soluzione

  1. Non capisco il motivo per cui non ha alcun senso per iniettare l'userDao.

  2. Non capisco perché il tuo XML utilizza fabbrica-method = "getInstance"; si può buttare via tutta la roba istanza e roba Singleton; primavera sarà un'istanza di una singola istanza della classe di servizio password e iniettarla però molte classi hanno bisogno, e saranno tutti ottenere la stessa istanza. Quindi, la primavera è la creazione di un singleton per voi. La classe di servizio password può essere un semplice POJO. Allo stesso modo per l'attuazione userDao.

Mi piacerebbe anche consigliare guardare, capire, e utilizzando le annotazioni di primavera. In pratica si utilizza @Service sulla classe che verrà iniettato, quindi utilizzare @Autowired sul setter nella classe in cui è iniettato. È inoltre necessario aggiungere qualcosa al vostro file di configurazione XML per attivare la roba di annotazione.

Altri suggerimenti

In aggiunta alla risposta di cui sopra, basta usare l'iniezione costruttore, se non si vuole un setter per il DAO:

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

A meno che il fagiolo non è una classe che controlli, non è necessario per renderlo un Singleton, Primavera lo farà per impostazione predefinita.

Io personalmente non sono un fan di annotazioni.

La mia soluzione era quella di avere un'interfaccia con un metodo di "autenticazione". Quindi creare una classe di servizio che implementa l'interfaccia con un costruttore che prende in un oggetto UserDAO. In questo modo, l'oggetto che richiede il servizio non esegue istanziazione (si fa per la primavera) e non è a conoscenza di ciò implementazione sottostante viene eseguita (LDAP, SSO, semplice confronto della password, ecc). Sembra ottenere il lavoro fatto: P

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