2010-07-01 9 views
5

Ho un provider di autenticazione personalizzato definito nella mia configurazione di Spring Security. Questa classe implementa AuthenticationProvider e posso accedere correttamente utilizzando il modulo definito sulla mia pagina. Il problema è che voglio chiamare questa classe non solo nella pagina di accesso, ma anche dalla pagina di registrazione.Spring - Chiama fornitore di autenticazione personalizzata da un controller

La pagina di registrazione utilizza una classe di comando diversa e raccoglie più informazioni rispetto al modulo di accesso. In questo momento, quando l'utente si registra, chiamo il controller appropriato, aggiungo il record al database e possono quindi accedere ma non vengono registrati automaticamente. Poiché mi hanno appena fornito il nome utente/password nella pagina di registrazione, posso quindi passarlo alla classe AuthenticationProvider personalizzata in modo che anche loro siano connessi?

Ho provato a creare una classe org.springframework.security.Authentication nel controller di registrazione e chiamando il metodo di autenticazione sulla classe AuthenticationProvider del mio cliente, e questo errore non viene eseguito, ma l'utente non ha effettuato l'accesso. Devo chiamare un metodo più in alto nella catena di filtri Spring Security per realizzare questo? Devo reindirizzare il controller all'URL j_spring_security_check? Se sì, come dovrei passare il nome utente/password?

risposta

1

È necessario inserire il risultato di AuthenticationProvider.authenticate() in SecurityContext (ottenuto da SecurityContextHolder).

Anche essere a conoscenza di AuthenticationSuccessEvent - se l'applicazione si basa su questo evento (alcune funzioni di Spring Security possono utilizzarlo anche), è necessario pubblicarlo (è possibile ottenere il valore predefinito AuthenticationEventPublisher tramite autowiring). Potrebbe essere utile racchiudere il provider di autenticazione con ProviderManager, che pubblica automaticamente l'evento utilizzando il publisher specificato.

2

Il problema riscontrato è che sebbene l'utente abbia autenticato correttamente l'utente, non è stato memorizzato il risultato di questa autenticazione nel SecurityContext dell'utente. In un'applicazione web this is a ThreadLocal object che il utilizza per store the user's credentials in the HTTPSession

È inoltre consigliabile evitare l'autenticazione direttamente con il proprio provider di autenticazione personalizzato, se possibile. La configurazione xml deve contenere un valore AuthenticationManager in cui è stato collegato il provider di autenticazione personalizzato. Ad esempio,

<bean id="customAuthenticationProvider" 
    class="com.foo.CustomAuthenticationProvider"> 
    <property name="accountService" ref="accountService"/> 
</bean> 
<security:authentication-manager alias="authenticationManager"> 
    <security:authentication-provider ref="customAuthenticationProvider"/> 
</security:authentication-manager> 

Se si collega il authenticationManager nel vostro servizio di registrazione e l'autenticazione usando che sarà inoltre,

Il nostro servizio di registrazione effettua le seguenti operazioni

final UsernamePasswordAuthenticationToken authRequest = new 
    UsernamePasswordAuthenticationToken(username, password); 

final Authentication authentication = 
    authenticationManager.authenticate(authRequest); 
SecurityContextHolder.getContext().setAuthentication(authentication); 

Abbiamo anche opzionalmente memorizzare il risultato di autenticazione a questo punto in un ricordo-me Cookie utilizzando il metodo di TokenBasedRememberMeServicesonLoginSuccess().

Problemi correlati