Spring Security工作时,Spring LdapRepository不返回任何结果

时间:2018-01-22 11:34:41

标签: java spring spring-data spring-ldap spring-repositories

我的问题

我正在使用LdapRepository从Ldap服务器获取用户信息。 Spring Security还会查询此Ldap服务器以验证用户身份。

我的问题是,Spring Security能够找到并识别用户,而我无法使用相同的LdapContextSource通过我的LdapRepository找到用户。以任何方式查询LdapRepository都不会返回结果(null或空列表)。

我尝试了什么

  • 直接使用ldapsearch工具 - 工作
  • 使用LdapQuery代替findByUsername方法 - 不起作用
  • 测试方法,例如findAll()CrudRepository) - 返回空列表
  • 尝试从spring-ldap - Seems to be impossible?
  • 获取日志

使用过ldapsearch命令:ldapsearch -x -H ldaps://<domain> -b o=<org> uid=<uid>

在Wireshark中查看流量(使用ldap而不是ldaps)看起来根本没有LdapRepository执行任何查询,连接只会打开并以0结果关闭。

相关代码

配置LdapContextSource

@Bean
public LdapContextSource contextSource() {
    LdapContextSource contextSource = new LdapContextSource();
    contextSource.setUrl("ldaps://<domain>");
    contextSource.setBase("o=<org>");
    return contextSource;
}

SecurityConfiguration

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    private final AuthenticationManagerBuilder authenticationManagerBuilder;

    private final LdapContextSource ldapContext;

    public SecurityConfiguration(AuthenticationManagerBuilder authenticationManagerBuilder, LdapContextSource ldapContext) {
        this.authenticationManagerBuilder = authenticationManagerBuilder;
        this.ldapContext = ldapContext;
    }

    @PostConstruct
    public void init() {
        try {
            authenticationManagerBuilder
                    .ldapAuthentication()
                    .contextSource(ldapContext)
                    .userSearchFilter("(uid={0})");
        } catch (Exception e) {
            throw new BeanInitializationException("Security configuration failed", e);
        }
    }
}

UserRepository

@Repository
public interface UserRepository extends LdapRepository<User> {
    User findByUsername(String username);
    List<User> findByUsernameLikeIgnoreCase(String username);
}

用户

@Entry(
  objectClasses = {})
public class User {
    @Id
    private Name id;

    @Attribute(name = "uid", readonly = true)
    private String username;

    public Name getId() {
        return id;
    }

    public String getUsername() {
        return username;
    }
}

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。

Spring似乎假设objectClass的{​​{1}}为User,如果没有明确设置的话。设置正确的objectClasses可以解决这个问题。