Java Spring LDAP Auth: всегда терпел неудачу, но отлично работает для тестирования подобных конфигураций в Nodejs - PullRequest
0 голосов
/ 23 октября 2018

Я довольно новый для Java / Spring.Если вам нужна дополнительная информация, пожалуйста, не стесняйтесь указывать.

Во-первых, я протестировал приведенные ниже коды в Javascript (nodejs), которые отлично работали .

var ldap = require('ldapjs');
var client = ldap.createClient({
  url: 'ldap://xx.xx.xx.xx:389'
});

client.bind('domain\\user1', 'user1_password', function (err) {

  if (err) {
    throw err;
    return
  }
  var opts = {
    filter: '(sAMAccountName=user2)',
    scope: 'sub',
    attributes: ['l', 'sn', 'cn', 'mail', 'displayName', 'postalCode', 'physicalDeliveryOfficeName', 'telephoneNumber' ]
  };
  client.search('dc=aaa,dc=bbb,dc=ccc', opts, function(err, res) {
    res.on('searchEntry', function(entry) {
      Object.entries(entry.object).forEach(([key, value]) => {
        console.log('Found Attribute: ', key, '; value:', value)
      })
    });
  });

Затем следуйте этому руководству:

http://forum.spring.io/forum/spring-projects/security/110491-how-to-modify-authority-after-loading-it-from-ldap

Я применил конфигурации , которые такие же, как указано выше , в spring / security.xml, например:

<bean id="customUserContextMapper" class="com.my.own.util.CustomUserDetailsMapper"/>
<sec:authentication-manager>
  <sec:ldap-authentication-provider
    user-search-base="dc=aaa,dc=bbb,dc=ccc"
    user-search-filter="(sAMAccountName={0})"
    user-context-mapper-ref="customUserContextMapper" 
  />
</sec:authentication-manager>
<sec:ldap-server url="ldap://xx.xx.xx.xx:389/"
     manager-dn="domain\user1" 
     manager-password="user1_password" 
/>

Но не удалось .

  1. При отправке (http-post) одна форма ( имя пользователя использует домен \ имя пользователя ), например username=domain%5Cuser1&password=user1_password&submit=Login, возвращено Причина: неверные учетные данные

  2. Если отправлено (http-post) одна форма ( имя пользователя не содержит домен ) какusername=user1&password=user1_password&submit=Login, возвращено 500 ошибка :

    org.springframework.ldap.NameNotFoundException: [LDAP: код ошибки 32 - 0000208D: NameErr: DSID-031001E5, проблема 2001 (NO_OBJECT),данные 0, лучшее соответствие: ''];вложенным исключением является javax.naming.NameNotFoundException: [LDAP: код ошибки 32 - 0000208D: NameErr: DSID-031001E5, проблема 2001 (NO_OBJECT), данные 0, наилучшее совпадение: ''];оставшееся имя ''

Для в первом случае , кажется, запись существует, но не удалось подтвердить пароль.так что верните неверные учетные данные .

Для для второго случая ошибка, по-видимому, говорит фильтр поиска неправильный (как CAS ADОшибка LDAP 32 указано)

Но я уверен, что ввел правильное имя пользователя и пароль, и фильтр поиска такой же, как уже проверенный в nodejs.

Уже застрялс этой проблемой в течение длительного времени, но не может найти одно решение.

Благодарим за любые предложения и решения.

Примечание: Я установил точку останова на входе в класс = com.my.own.util.CustomUserDetailsMapper, но он никогда не срабатывал, поэтому я не заключил его коды.

1 Ответ

0 голосов
/ 23 октября 2018

Наконец, я обнаружил, что нижеприведенная конфигурация работает хорошо.

Ниже <bean id="ldapAuthProvider"> построить два аргумента ,

Первый аргумент : он проверитимя пользователя и пароль, которые конечный пользователь вводит во внешнем интерфейсе.

Второй аргумент : после успешного прохождения через аутентификатор он вызовет наш собственный заполнитель (<bean class="com.my.own.util.MyCustomLdapAuthPopulator">) дляназначьте соответствующие роли или сделайте что-нибудь еще, что вам нужно.

<sec:authentication-manager>  
    <sec:authentication-provider 
        ref="ldapAuthProvider"
        >  
    </sec:authentication-provider>  
</sec:authentication-manager> 

<bean id="ldapAuthProvider"  
    class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider" >  
    <constructor-arg>  
        <bean id="authenticator"  
            class="org.springframework.security.ldap.authentication.BindAuthenticator">  
            <constructor-arg ref="contextSource" />  
            <property name="userSearch">  
                <bean  
                    class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch">  
                    <constructor-arg value="dc=aaa,dc=bbb,dc=ccc" />  
                    <constructor-arg value="(sAMAccountName={0})" />  
                    <constructor-arg ref="contextSource" />  
                </bean>  
            </property>  
        </bean>  
    </constructor-arg>
        <constructor-arg>
            <bean class="com.my.own.util.MyCustomLdapAuthPopulator">
                <constructor-arg ref="contextSource" />
                <constructor-arg value="dc=aaa,dc=bbb,dc=ccc" />
                <property name="searchSubtree" value="true" />
                <property name="ignorePartialResultException" value="true" />
                <property name="groupSearchFilter" value="(member={0})" />
            </bean>
        </constructor-arg>
</bean> 
<bean id="contextSource"  
    class="org.springframework.security.ldap.DefaultSpringSecurityContextSource" >  
    <constructor-arg value="ldap://xx.xx.xx.xx:389/" />
    <property name="userDn" value="domain\user1" />    
    <property name="password" value="user1_password" />
</bean> 

Ниже приведена одна простая реализация для нашего собственного заполнителя.

import org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator;
public class MyCustomLdapAuthPopulator extends DefaultLdapAuthoritiesPopulator {

    @Autowired
    public MyCustomLdapAuthPopulator(ContextSource contextSource, String groupSearchBase) {
        super(contextSource, groupSearchBase);
        // TODO Auto-generated constructor stub
    }

    @Override
    protected Set<GrantedAuthority> getAdditionalRoles(DirContextOperations user, String username) {
        Set<GrantedAuthority> authorities = new HashSet<GrantedAuthority>();
        authorities.add((new SimpleGrantedAuthority("ROLE_XXX")));
        return authorities;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...