【问题标题】:How do I access the user's password from LDAP in a LdapUserDetailsMapper using spring security?如何使用 Spring Security 从 LdapUserDetailsMapper 中的 LDAP 访问用户密码?
【发布时间】:2011-11-12 03:36:31
【问题描述】:

我们在基于 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 中的密码正确匹配。

【问题讨论】:

    标签: passwords ldap spring-security


    【解决方案1】:

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

    【讨论】:

    • 嗨。谢谢回复。如何更改连接的身份验证状态以有权读取 userPassword 属性的值?我们的遗留代码可以读取密码属性并存储在数据库中。只有在我们修改它以使用spring security之后,我们才能读取密码。,
    • 身份验证状态由 BIND 请求设置。除了由 BIND 在连接上建立的身份验证身份之外,可能还有其他访问控制来防止客户端读取属性。如果您的新应用程序和旧应用程序使用相同的身份验证身份(传递给 BIND 请求的值),除非其他一些保护措施阻止它,否则客户端应该能够读取 userPassword 属性的值。向您的目录服务器管理员询问“访问控制说明”(ACI)。
    • ..and applications have no need to read the value. 并非总是如此。当您使用 ldap 在系统旁边执行用户身份验证时,读取哈希会很有用。一个不同的用例是 Automount,它(可以)使用 ldap 存储连接/安装时使用的凭据。当然,这需要加密的凭据而不是散列,但它仍然是一种用途......
    • 在这种情况下,依赖于加密哈希格式的应用程序会失败,因为所有服务器不会以相同的方式创建哈希,例如,盐的长度和位置可能不同.
    猜你喜欢
    • 2014-09-13
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    • 2021-03-16
    • 2018-10-08
    • 2014-09-20
    • 2011-12-24
    • 2012-03-28
    相关资源
    最近更新 更多