如何使用spring security在LdapUserDetailsMapper中从LDAP访问用户密码?

时间:2011-09-07 12:55:20

标签: passwords ldap spring-security

我们在基于spring MVC的Web应用程序中使用spring security。

我们正在使用正常工作的spring security的LDAP模块进行身份验证。现在我需要从LDAP获取用户密码以保存在数据库中。

为此,我在我的代码中使用它。

    public class PersonContextMapper implements UserDetailsContextMapper {

    public UserDetails mapUserFromContext(DirContextOperations ctx, String username, Collection<GrantedAuthority> authorities) {
    Person.Essence p = new Person.Essence(ctx);

    p.setUsername(username);
    p.setAuthorities(authorities);

        Object passwordValue = ctx.getObjectAttribute("userPassword");

    return p.createUserDetails();

    }

    public void mapUserToContext(UserDetails user, DirContextAdapter ctx) {
    Assert.isInstanceOf(Person.class, user, "UserDetails must be a Person instance");

    Person p = (Person) user;
    p.populateContext(ctx);
    }
}

但我没有获得密码的任何值。它总是空的。

请帮忙。

PS。我的身份验证成功。这意味着在登录表单中输入的密码与存储在LDAP中的密码正确匹配。

1 个答案:

答案 0 :(得分:2)

可能是连接的身份验证状态没有读取userPassword属性值的权限。大多数情况下,应用程序向目录服务器发出BIND请求,包括必要的适当控件。密码包含在BIND请求中,目录服务器在成功完成BIND请求后更改连接的身份验证状态。在任何情况下,userPassword属性的值都经常被加密或散列,应用程序无需读取值。