Я довольно новый для 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"
/>
Но не удалось .
При отправке (http-post) одна форма ( имя пользователя использует домен \ имя пользователя ), например username=domain%5Cuser1&password=user1_password&submit=Login
, возвращено Причина: неверные учетные данные
Если отправлено (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
, но он никогда не срабатывал, поэтому я не заключил его коды.