2013-04-10 41 views
6

Tôi muốn tích hợp Facebook Social Social vào ứng dụng của tôi với Spring Security (tôi sử dụng cấu hình xml). Tất cả những gì tôi cần là chỉ cần kết nối tài khoản facebook với tài khoản của ứng dụng của tôi. Trong ví dụ đơn giản, tôi thấy điều này: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> 

Vì vậy, như tôi hiểu, phương pháp này phát huy tác:

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

Nó resives "userId" từ #{request.userPrincipal.name}. Vì vậy, câu hỏi của tôi: Làm thế nào tôi có thể vượt qua "userId" cho phương pháp này nếu tôi muốn có được điều này "userId" sử dụng SecurityContextHolder.getContext().getAuthentication().getPrincipal().

Cách duy nhất tôi thấy là tạo triển khai JdbcUsersConnectionRepository và xác định lại phương pháp createConnectionRepository(String userId). Nhưng có lẽ có giải pháp thanh lịch hơn.

Trả lời

7

Có một cách khác:

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

} 

Bạn có thể làm điều đó complitely trong SPeL quá (tôi không thích loại này phụ thuộc):

<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

Trong 1.0.x Xuân Xã hội, SpEL là cách tốt nhất (mặc dù hơi cồng kềnh). Trong Spring Social 1.1.0 có một không gian tên cấu hình dựa trên XML mới và một giao diện UserIdSource. Bạn thực hiện UserIdSource để tra cứu ID người dùng (tuy nhiên bạn thấy phù hợp) và cấu hình nó như một bean. Các phần tử cấu hình XML sẽ tìm kiếm UserIdSource đó và sử dụng nó. –

+0

FWIW, thực tế là biểu thức Spel chỉ là chuỗi và do đó không dễ dàng kiểm tra hoặc nhất thiết phải an toàn là lý do chính khiến họ cảm thấy kludgy ở đây. Nhưng nhờ thực tế rằng bạn đang chọn XML để cấu hình, bạn đã quyết định chống lại một tùy chọn cấu hình an toàn. Trong đó có tôi tự hỏi tại sao bạn không muốn sử dụng cấu hình Java, đó là tùy chọn mạnh mẽ hơn và an toàn hơn để cấu hình Spring? –

+0

Cảm ơn bạn đã làm rõ Craig. Giao diện UserIdSource là một tin tốt (chúng ta cần chờ 1.1.0.RELEASE để có thể sử dụng nó trong mã sản xuất). Đối với bạn câu hỏi thứ hai: lý do rất đơn giản. Chúng tôi có một dự án đã sử dụng cấu hình dựa trên xml cho Spring và Spring Security (khuôn khổ đậu). Chú thích chỉ được sử dụng cho các hạt cà phê của ứng dụng. Tôi nghĩ rằng nó sẽ được nhiều conviniet cho nhóm hỗ trợ để có tất cả các công cụ cấu hình trong một định dạng (xml). Không có cách nào để làm java conf với Spring Security AFAIK. –

Các vấn đề liên quan