2013-04-10 7 views
6

Voglio integrare Spring Social facebook nella mia applicazione con Spring Security (utilizzo le configurazioni xml). Tutto ciò di cui ho bisogno è semplicemente collegare l'account Facebook con l'account della mia app. Nel semplice esempio ho trovato questo:Facebook di primavera sociale + Spring Security

<bean id="connectionRepository" factory-method="createConnectionRepository" 
     factory-bean="usersConnectionRepository" scope="request"> 
    <constructor-arg value="#{request.userPrincipal.name}" /> 
    <aop:scoped-proxy proxy-target-class="false" /> 
</bean> 

Quindi, come ho capito, questo metodo entra in gioco:

public ConnectionRepository createConnectionRepository(String userId) { 
     if (userId == null) { 
      throw new IllegalArgumentException("userId cannot be null"); 
     } 
     return new JdbcConnectionRepository(userId, jdbcTemplate, connectionFactoryLocator, textEncryptor, tablePrefix); 
    } 

E resives "userId" da #{request.userPrincipal.name}. Quindi, la mia domanda: come posso passare "userId" a questo metodo se voglio ottenere questo "userId" utilizzando SecurityContextHolder.getContext().getAuthentication().getPrincipal().

L'unico modo che vedo è creare la mia implementazione di JdbcUsersConnectionRepository e ridefinire il metodo createConnectionRepository(String userId). Ma forse c'è una soluzione più elegante.

risposta

7
Ci

è un altro modo:

<bean id="connectionRepository" factory-method="createConnectionRepository" factory-bean="usersConnectionRepository" 
    scope="request"> 
    <constructor-arg value="#{authenticationService.getAuthenticatedUsername()}" /> 
    <aop:scoped-proxy proxy-target-class="false" /> 
</bean> 

@Service("authenticationService") 
public class AuthenticationService { 

    public String getAuthenticatedUsername() { 
     return SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
    } 

} 

si può fare a complitely SPEL troppo (non mi piace questo tipo di dipendenze):

<bean id="connectionRepository" factory-method="createConnectionRepository" factory-bean="usersConnectionRepository" 
    scope="request"> 
    <constructor-arg value="#{T(org.springframework.security.core.context.SecurityContextHolder).getContext().getAuthentication().getPrincipal()}" /> 
    <aop:scoped-proxy proxy-target-class="false" /> 
</bean> 
+0

In 1.0.x Primavera sociale, la SPEL è il modo migliore (anche se un po 'macchinoso). In Spring Social 1.1.0 è disponibile un nuovo spazio dei nomi di configurazione basato su XML e un'interfaccia UserIdSource. Implementa UserIdSource per cercare l'ID utente (comunque lo ritieni opportuno) e configurarlo come bean. Gli elementi di configurazione XML cercheranno UserIdSource e lo utilizzeranno. –

+0

FWIW, il fatto che le espressioni Spel siano solo stringhe e quindi non siano facilmente testabili o necessariamente dattiloscritti è la ragione principale per cui si sentono quieti. Ma in virtù del fatto che stai scegliendo XML per la configurazione, hai già deciso contro un'opzione di configurazione tipicamente valida. Qual è il motivo per cui non vorresti utilizzare la configurazione Java, che è l'opzione più potente e sicura per la configurazione di Spring? –

+0

Grazie per il tuo chiarimento Craig. L'interfaccia UserIdSource è una buona notizia (dobbiamo aspettare 1.1.0.RELEASE per poterlo usare nel codice di produzione). Per te seconda domanda: la ragione è semplice. Abbiamo un progetto che già usa la configurazione basata su XML per Spring e Spring Security (framework beans). Le annotazioni vengono utilizzate solo per i bean di appllicazione. Penso che sarà più conveniente per il team di supporto avere tutte le cose di configurazione in un formato (xml). Non c'è modo di fare java conf con Spring Security AFAIK. –

Problemi correlati