Spring Boot Sping Boot LDAP检查用户是否属于特定组

xuo3flqw  于 2023-01-13  发布在  Spring
关注(0)|答案(1)|浏览(211)

我正在构建一个应用程序,它只允许我的组织中的一组特定用户登录。只有属于特定AD组的用户才能登录。例如:GDL -我的团队是一个GDL,只有谁的成员,我想允许进入。我检查了亚特兰蒂斯的tutorial,汇合的tutorial以及Megha的答案here
与其他堆栈溢出问题相比,我的例子中的不同之处在于我使用了ActiveDirectoryLdapAuthenticationProvider,正如下面的代码片段所示,这是一个指定的术语。
然而,我的应用程序仍然允许组织中的任何用户进入我的应用程序。我真的不能理解它使用什么标准来允许任何人。我完全是一个新手ldiff语法和过滤ldap使用Java。合并springboot,我真的不知道我是否应该使用组搜索库或用户搜索库。我只是希望我的GDL的人能够进入。Rest应收到身份验证失败。
下面是我的代码文件以供参考:

@Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {

        configureLdap(auth);
        configureActiveDirectory(auth);

    }

    private void configureLdap(AuthenticationManagerBuilder auth) throws Exception {

        auth
            .ldapAuthentication()
            .contextSource(contextSource())
            .userSearchFilter("(&(objectClass=user)(sAMAccountName=*)(memberOf=cn=GDL-MyTeam,ou=users,dc=myCompany,dc=com)))")
            .passwordCompare()
            .passwordEncoder(passwordEncoder())
            .passwordAttribute("userPassword");
    }

    private void configureActiveDirectory(AuthenticationManagerBuilder auth) {
        ActiveDirectoryLdapAuthenticationProvider adProvider = activeDirectoryLdapAuthenticationProvider();
        if (adProvider != null) {
            auth.authenticationProvider(adProvider);
            auth.eraseCredentials(false);
        }
    }

    @Bean(BeanIds.AUTHENTICATION_MANAGER)
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

    @Bean
    public LdapContextSource contextSource() {

        LdapContextSource contextSource = new LdapContextSource();
        contextSource.setUrl(ldapUrls); //mycompany.com:389
        contextSource.setBase(ldapBaseDn); //dc=myCompany,dc=com
        contextSource.setUserDn(env.getProperty(ldapSecurityPrincipal));
        contextSource.setPassword(env.getProperty(ldapPrincipalPassword));
        contextSource.setReferral("follow");

        contextSource.afterPropertiesSet();

        return contextSource;
    }

    @Bean
    protected ActiveDirectoryLdapAuthenticationProvider activeDirectoryLdapAuthenticationProvider() {

        ActiveDirectoryLdapAuthenticationProvider provider = new ActiveDirectoryLdapAuthenticationProvider("myCompany.com", ldapUrls,
            ldapBaseDn);
        provider.setConvertSubErrorCodesToExceptions(true);
        provider.setUseAuthenticationRequestCredentials(true);
        provider.setUserDetailsContextMapper(new CustomUserDetailsContextMapper());

        return provider;
    }

    @Bean
    public LdapTemplate ldapTemplate() {
        LdapTemplate template = new LdapTemplate();
        template.setContextSource(contextSource());
        template.setIgnoreNameNotFoundException(true);
        template.setIgnorePartialResultException(true);
        return template;
    }

我相信这个过滤器是我指定正确匹配条件的地方,但是由于某种原因,它允许每个人而不仅仅是我的团队的特定GDL。

.userSearchFilter("(&(objectClass=user)(sAMAccountName=*)(memberOf=cn=GDL-MyTeam,ou=users,dc=myCompany,dc=com)))")

有没有人能提供指导,我哪里错了。非常感谢!
编辑:我发现是ActiveDirectoryLdapAuthenticationProvider决定了搜索条件。我相信这就是我需要放入搜索过滤器的地方。如果我放入与其他答案完全相同的过滤器

In order to perform this operation a successful bind must be completed on the connection., data 0, v3839]; remaining name '/'

但我真的不知道该写些什么。能给点建议吗?

w3nuxt5m

w3nuxt5m1#

我想知道这是否是问题所在:

.userSearchFilter("(&(objectClass=user)(sAMAccountName=*)(memberOf=cn=GDL-MyTeam,ou=users,dc=myCompany,dc=com)))")

您使用sAMAccountName=*(带 *)。在我看来像是通配符,表示任何人?。如果您将其替换为{1},如

.userSearchFilter("(&(objectClass=user)(sAMAccountName={1})(memberOf=cn=GDL-MyTeam,ou=users,dc=myCompany,dc=com)))")

相关问题