对于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(没有\u对象),数据0,最佳匹配:
’
];嵌套异常是javax.naming.namenotfoundexception:[ldap:错误代码32-0000208d:nameerr:dsid-031001e5,问题2001(没有对象),数据0,最佳匹配:
’
];剩余名称''
为了
第一个案子
,该项似乎存在,但无法验证密码。所以返回
错误的凭据
.
为了
第二个案子
,错误似乎表明
搜索筛选器错误
(AS)
CAS AD LDAP 32 error
指出)
但我确信我输入了正确的用户名和密码,搜索过滤器与nodejs中已经测试过的相同。
已经在这个问题上纠结了很长时间,但找不到一个解决办法。
感谢您的建议和解决方案。
注:
我在类的入口设置了断点=
com.my.own.util.CustomUserDetailsMapper
,但它从未被触发,所以我没有附上它的代码。