2017-05-04 111 views
5

Tôi sử dụng Spring Data LDAP và Spring Boot cung cấp hỗ trợ hộp cho máy chủ UnboundID được nhúng. Tuy nhiên, khi tôi sử dụng chú thích @Entry của Spring Data LDAP, tôi cần chỉ định một khác nhau base trong chú thích dựa trên việc tôi đang sử dụng máy chủ LDAP UnboundID được nhúng hay máy chủ Thư mục Họat động từ xa.Spel không được hỗ trợ trong chú thích Spring @ Entry.base

Tôi đã cố gắng để làm điều này với SpEL và tài sản dựa trên profile bằng cách xác định:

@Entry(base = "${ldap.person.base}", ...) 

Sau đó, tôi có một application.propreties với ldap.person.base=OU=AD Person Base và một application-embedded.properties với ldap.person.base=OU=Embedded Person Base.

Tuy nhiên, @Entry chú thích dường như không hỗ trợ SpEL đánh giá:

javax.naming.InvalidNameException: Tên không hợp lệ: $ {} ldap.person.base

Có một open issue trong Spring LDAP để thêm hỗ trợ cho việc này, nhưng có cách nào khác hay cách nào khác tôi có thể thực hiện việc này cho đến khi nó được hỗ trợ trong Spring LDAP?

+0

Có sự cố mở trong https://github.com/spring-projects/spring-ldap/issues/444 –

+0

@PavanKumarJorrigala cảm ơn bạn - đã thêm liên kết đến câu hỏi.Tôi chỉ thấy rằng gần đây là tốt. –

Trả lời

1

Lý do tôi cần một khác nhau base ở nơi đầu tiên là vì Mùa xuân không đặt base trên số ContextSource.

Khi bạn để cho mùa xuân Boot autoconfigure máy chủ LDAP nhúng, nó tạo ra một ContextSource như vậy trong EmbeddedLdapAutoConfiguration:

@Bean 
@DependsOn("directoryServer") 
@ConditionalOnMissingBean 
public ContextSource ldapContextSource() { 
    LdapContextSource source = new LdapContextSource(); 
    if (hasCredentials(this.embeddedProperties.getCredential())) { 
     source.setUserDn(this.embeddedProperties.getCredential().getUsername()); 
     source.setPassword(this.embeddedProperties.getCredential().getPassword()); 
    } 
    source.setUrls(this.properties.determineUrls(this.environment)); 
    return source; 
} 

Như bạn có thể thấy, không nơi nào ở đó làm nó gọi source.setBase(). Vì vậy, để giải quyết việc này, tôi đã thêm một tập tin cấu hình với @Profile("embedded") và tự tạo ra một ContextSource nơi tôi đặt base bản thân mình (tôi rời khỏi phần thông tin bởi vì tôi không sử dụng thông tin cho máy chủ nhúng):

@Configuration 
@Profile("embedded") 
@EnableConfigurationProperties({ LdapProperties.class }) 
public class EmbeddedLdapConfig { 

    private final Environment environment; 
    private final LdapProperties properties; 

    public EmbeddedLdapConfig(final Environment environment, final LdapProperties properties) { 
     this.environment = environment; 
     this.properties = properties; 
    } 

    @Bean 
    @DependsOn("directoryServer") 
    public ContextSource ldapContextSource() { 
     final LdapContextSource source = new LdapContextSource(); 
     source.setUrls(this.properties.determineUrls(this.environment)); 
     source.setBase(this.properties.getBase()); 
     return source; 
    } 
} 

Bây giờ, tôi có thể để nguyên giá trị của thuộc tính base trong số @Entry tương tự cho cả máy chủ Active Directory và máy chủ UnboundID được nhúng và nó hoạt động bình thường.

+0

Công việc tốt làm cho nó hoạt động! Xin vui lòng xem xét upvoting câu trả lời của tôi kể từ khi bạn rõ ràng sử dụng phương pháp tôi đề nghị để sửa chữa nó. –

2

Tôi không chắc chắn mình đang theo dõi ở đây, nhưng giả sử bạn đang sử dụng cấu hình tự động LDAP trong Khởi động mùa xuân, không đủ để đặt thuộc tính spring.ldap.base thành một hoặc khác (OU=AD Person Base hoặc OU=Embedded Person Base) trên tiểu sử bạn đang sử dụng?

Cả hai EmbeddedLdapAutoConfigurationLdapAutoConfiguration sử dụng đối tượng LdapProperties để đặt các thuộc tính khác nhau trên LdapContextSource khi tạo bean, bao gồm base. Theo như tôi có thể nói, bạn sẽ không phải xác định nó cho mỗi @Entry trong codebase của bạn nếu LdapContextSource.base được đặt.

Nếu bạn không sử dụng cấu hình tự động và nếu tôi chính xác trong các giả định của mình, bạn vẫn có thể tạo bean LdapContextSource của riêng mình và đặt base giá trị mong muốn dựa trên thuộc tính Spring.

+0

Khi tôi làm điều này, nó hoạt động trong phiên bản nhúng, nhưng tôi nhận được 'javax.naming.PartialResultException: (Các) Tham chiếu Liên tục Chưa được xử lý; tên còn lại '/' 'khi ứng dụng thực hiện tìm kiếm LDAP đối với Active Directory. Nếu tôi chỉ định 'base =" OU = Domain Users "' trong mục 'Person' của tôi, nó hoạt động, nhưng sau đó phá vỡ phiên bản được nhúng. –

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