2011-09-07 93 views
1

我們在基於spring MVC的web應用程序中使用spring安全性。如何使用spring security在LdapUserDetailsMapper中從LDAP訪問用戶的密碼?

我們正在使用正常工作的spring安全性的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

可能是連接的身份驗證狀態沒有權限讀取userPassword屬性的值。大多數情況下,應用程序會向目錄服務器發出BIND請求,包括必要時的相應控件。密碼包含在BIND請求中,目錄服務器在成功完成BIND請求後更改連接的身份驗證狀態。在任何情況下,userPassword屬性的值經常被加密或散列,應用程序不需要讀取該值。

+0

嗨。謝謝回覆。如何更改連接的身份驗證狀態以具有讀取userPassword屬性值的權限?我們的遺留代碼可以讀取密碼屬性並存儲在數據庫中。它只有在我們修改它來使用彈簧安全性之後,我們才能夠讀取密碼。, – ashishjmeshram

+0

認證狀態由BIND請求設置。除了由BIND在連接上建立的身份驗證身份之外,還可能存在額外的訪問控制,防止客戶端讀取屬性。如果您的新應用程序和您的遺留應用程序使用相同的身份驗證標識(傳遞給BIND請求的值),除非其他保護措施不允許,則客戶端應該能夠讀取userPassword屬性的值。詢問您的目錄服務器管理員關於「訪問控制指令」(ACI)。 –

+1

'..應用程序不需要讀取值。「並非總是嚴格正確。當您在使用ldap的系統旁邊執行用戶身份驗證時,讀取散列值可能很有用。另一個用例是Automount,它可以使用ldap存儲連接/安裝時要使用的憑證。當然,這需要加密的信用而不是散列,但仍然是,這是一種用途... – Basic

相關問題