Проблема с Spring LDAP Auth - PullRequest
       27

Проблема с Spring LDAP Auth

0 голосов
/ 10 мая 2019

Так что я впервые работаю со Spring, так что терпите меня!

Я почти уверен, что проблема в том, что мои настройки для DnPatterns и базы поиска групп неверны.

Есть внешняя реклама, которую я пытаюсь подключить. С помощью проводника объявлений я нашел запись, ниже приведен dn пользователя, а затем логин в id, который они обычно используют для входа в систему

Как указано в профиле пользователя в AD Explorer View

DN -> CN=LastName\, FirstName, OU=Users,OU=Calgary,DC=CORP,DC=DEPARTMENT,DC=com

Имя пользователя и пароль Пользователь предоставит при входе в систему:

UserName ->  LastFirst5
Password ->  Password

Путь для получения информации о пользователе в проводнике каталогов показан ниже

DC=CORP,DC=DEPARTMENT,DC=com -> OU=Calgary -> OU=Users -> CN=LastName,FirstName

Это моя конфигурация конфигурации:

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .anyRequest().fullyAuthenticated()
                .and()
                .formLogin();
    }


    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .ldapAuthentication()
                .userDnPatterns("DC=corp,DC=department,DC=com")
                .groupSearchBase("OU=Users,OU=Calgary,DC=CORP,DC=Department,DC=com")
                .contextSource()
                .url("ldap://corp.Ad.com/")
                .and()
                .passwordCompare()
                .passwordEncoder(new LdapShaPasswordEncoder())
                .passwordAttribute("userPassword");
    }

1 Ответ

1 голос
/ 10 мая 2019
  • Сначала URL источника контекста должен включать базовое DN для поиска и / или аутентификации пользователей.

    .contextSource()
      .url('ldap://corp.Ad.com:389/DC=CORP,DC=DEPARTMENT,DC=com')
    
  • userDnPatterns() используется для соответствияимя пользователя для входа в том виде, в каком оно отображается в RDN ваших записей пользователя - , если оно появляется! - сервер затем подставляет имя входа, введенное пользователем, в качестве заполнителя {0}, после чего воссоздаетпользователь dn, добавив базовый dn из URL-адреса LDAP.Проблема в том, что в вашем каталоге пользователь dn не построен из своего имени пользователя, но из его атрибута cn, который отличается, поэтому вы не можете иметь совпадение (LastName, FirstName ≠ LastFirst5), следовательно, вы можетене аутентифицируйте пользователей с помощью этого метода (но правильный шаблон будет выглядеть как cn={0},ou=Users, если имя пользователя и cn эквивалентны).

  • userSearchFilter(), с другой стороны, может использоваться для сопоставления имени для входа, предоставленного пользователем с помощью обычного поискового фильтра.Опционально userSearchBase() может использоваться вместе с ним для установки необязательной ветви rdn, в которой находятся пользовательские записи и из которой следует выполнять поиск, если не указано, поиск включает весь ваш каталог, начиная с базового dn URL-адреса LDAP.

    .and()
      .userSearchBase('ou=Users,ou=Calgary')
      .userSearchFilter('(sAMAccountName={0})')
    

    Обратите внимание, что если у вас есть пользователи в других городах, например, OU=Users,OU=OtherCity,DC=..., вам потребуется другая конфигурация, чтобы аутентифицировать их, не зная, из какого города начинать поиск.В этом случае вы должны сбросить базу поиска, чтобы она соответствовала всем записям в базе данных dn, и, поскольку вы хотите, чтобы только пользователи могли входить в систему, вы бы уточнить фильтр соответствующим образом:

    .and()
      .userSearchBase('')
      .userSearchFilter('(&(sAMAccountName={0})(objectClass=user)')
    
  • Вам не нужно groupSearchBase() без groupSearchFilter(), и эти 2 нужны только для авторизации (чтобы убедиться, что пользователь имеет заданную роль <=> является членом данной группы).

  • Чтобы иметь возможность поиска и сопоставления записи пользователя, сам запрос аутентификации должен подключаться и связываться с сервером LDAP, большинство серверов не принимают анонимные привязки, поэтому вам может потребоватьсяset managerDn () и managerPassword ():

    .contextSource()
      .url('ldap://corp.Ad.com:389/DC=CORP,DC=DEPARTMENT,DC=com')
      .managerDn('admin')
      .managerPassword('password')
    

https://community.jaspersoft.com/documentation/jasperreports-server-authentication-cookbook/performing-ldap-user-search

...