2013-04-10 20 views
6

Chcę włączyć Spring Social facebook do mojej aplikacji z Spring Security (używam konfiguracji xml). Potrzebuję tylko połączyć konto na Facebooku z kontem mojej aplikacji. W prostym przykładzie Znalazłem to:Spring Social facebook + 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> 

Tak, jak zrozumiałem, metoda ta wchodzi w grę:

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

To resives "userId" od #{request.userPrincipal.name}. Tak, moje pytanie: Jak mogę przekazać "userId" tej metody, jeśli chcę uzyskać "userId" przy użyciu SecurityContextHolder.getContext().getAuthentication().getPrincipal().

Jedyny sposób, jaki widzę, to utworzenie mojej implementacji JdbcUsersConnectionRepository i przedefiniowanie metody createConnectionRepository(String userId). Ale może jest bardziej eleganckie rozwiązanie.

Odpowiedz

7
Nie

jest inny sposób:

<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(); 
    } 

} 

Można to zrobić complitely w Spel też (nie lubię tego rodzaju zależnościami):

<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

W 1.0.x Wiosna Społecznemu, Spel jest najlepszym sposobem (choć nieco uciążliwym). W Spring Social 1.1.0 istnieje nowy obszar nazw konfiguracji oparty na XML i interfejs UserIdSource. Zaimplementujesz UserIdSource, aby wyszukać identyfikator użytkownika (jakkolwiek pasujesz) i skonfigurować go jako komponent bean. Elementy konfiguracji XML będą szukać tego UserIdSource i będą z niego korzystać. –

+0

FWIW, fakt, że wyrażenia SpEL są tylko ciągami, a zatem nie są łatwe do sprawdzenia lub niekoniecznie bezpieczne, jest głównym powodem, dla którego czują się tutaj kludgy. Ale ze względu na to, że wybierasz XML do konfiguracji, już zdecydowałeś się na opcję konfiguracji bezpiecznych typów. Co mnie zastanawia, dlaczego nie chciałbyś używać konfiguracji Java, która jest mocniejszą i bardziej bezpieczną opcją konfiguracji Spring? –

+0

Dziękuję za wyjaśnienia Craig. Interfejs UserIdSource to dobra wiadomość (musimy czekać na 1.1.0.RELEASE, aby móc go użyć w kodzie produkcyjnym). Dla ciebie drugie pytanie: powód jest prosty. Mamy projekt, który już używa konfiguracji opartej na XML dla Spring and Spring Security (framework fasoli). Adnotacje są używane tylko dla ziaren aplikacji. Myślę, że będzie to bardziej przekonujące dla zespołu wsparcia, który będzie miał wszystkie pliki konfiguracyjne w jednym formacie (xml). Nie ma sposobu, by zrobić java conf z Spring Security AFAIK. –

Powiązane problemy