2013-04-10 4 views
6

Я хочу интегрировать Spring Social facebook в мое приложение с Spring Security (я использую xml-конфигурации). Все, что мне нужно, это просто подключить учетную запись facebook с учетной записью моего приложения. В простом примере я нашел это: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> 

Итак, как я понял, этот метод входит в игру:

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

Это resives "userId" от #{request.userPrincipal.name}. Итак, мой вопрос: как я могу передать «userId» этому методу, если я хочу получить это «userId», используя SecurityContextHolder.getContext().getAuthentication().getPrincipal().

Единственный способ, который я вижу, - создать мою реализацию JdbcUsersConnectionRepository и переопределить метод createConnectionRepository(String userId). Но, возможно, есть более элегантное решение.

ответ

7

Существует еще один способ:

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

} 

Вы можете сделать это complitely в SPEL тоже (я не люблю этот вид зависимостей):

<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

В Спринг социальной 1.0.x, то SPEL это лучший способ (хотя и немного громоздкий). В Spring Social 1.1.0 есть новое пространство имен конфигурации на основе XML и интерфейс UserIdSource. Вы реализуете UserIdSource для поиска идентификатора пользователя (как вы считаете нужным) и настраиваете его как компонент. Элементы конфигурации XML будут искать этот UserIdSource и использовать его. –

+0

FWIW, тот факт, что выражения SpEL являются просто строками и, следовательно, не легко проверяются или обязательно являются типичными, это главная причина, по которой они чувствуют себя kludgy здесь. Но в силу того факта, что вы выбираете XML для конфигурации, вы уже решили не использовать конфигурационную конфигурацию. Что мне интересно, почему вы не хотите использовать конфигурацию Java, которая является более мощным и типичным вариантом для настройки Spring? –

+0

Спасибо за разъяснение Крейга. Интерфейс UserIdSource - хорошая новость (нам нужно дождаться 1.1.0.RELEASE, чтобы иметь возможность использовать его в производственном коде). Для вас второй вопрос: причина проста. У нас есть проект, который уже использует конфигурацию на основе xml для Spring и Spring Security (фреймворки). Аннотации используются только для бланков аппликации. Я думаю, что для команды поддержки будет более комфортно иметь все файлы конфигурации в одном формате (xml). Невозможно выполнить java conf с Spring Security AFAIK. –

Смежные вопросы