2010-11-19 96 views
2

我正在爲LDAP服務器編寫Web前端(django)。有不同類型的人擁有不同的權限,因此我設置了LDAP ACL來控制誰可以查看或編輯特定的屬性。 現在很容易確定某個特定用戶是否具有讀取權限 - 嘗試閱讀,您將看到您獲得的信息。 但我沒有看到一個優雅的方式來區分之前的讀寫訪問我實際上嘗試寫一些更改。也就是說,我想在界面中說清楚,如果登錄的用戶有寫訪問權限,或者只能讀取。所以用戶不會嘗試編輯他們不能的屬性。使用python檢查ldap訪問權限

我想到的唯一辦法是嘗試暫時將某種虛擬物寫入屬性中,並查看是否成功。如果是這樣,原始值將被恢復,並且我知道該用戶具有寫入權限。然後我可以將此屬性顯示爲可編輯。 這樣做的問題是如果服務器在虛擬文件被寫入之後並且原始值已被恢復之前崩潰,則在我的LDAP服務器中留下虛擬值。

我需要的是一些查詢ACL的方式,類似於我可以查詢模式定義的方式。但也許這是LDAP「禁止」的?

任何想法?

艾薩克

+0

哪些LDAP服務器你使用?您使用哪種界面/綁定來訪問它? – ThomasH 2010-11-19 11:55:38

+0

我使用openldap 2.3.32和python 2.6 ldap綁定(import ldap) – Isaac 2010-11-19 12:02:20

+0

我發現我不需要編寫一個虛擬文件來查看我是否具有寫入權限。我可以嘗試寫入原始值,如果我沒有寫入權限,將導致錯誤,並且如果我具有讀權限,則不會更改任何內容。儘管如此,看起來不那麼優雅。 – Isaac 2010-11-19 12:08:30

回答

0

ACL,對OpenLDAP的由OU和/或DN檢查與正則表達式組織

例如:

access to attrs=userPassword 
    by anonymous auth 
    by self write 
    by dn.base="ou=users_with_userPassword_write_access,dc=myproduct,dc=org" write 
    by dn.exact="cn=manager,dc=myproduct,dc=org" write 
    by * none 

access to * 
    by dn.exact="cn=manager,dc=myproduct,dc=org" write 
    by dn.base="ou=users_with_powerfull_write_access,dc=myproduct,dc=org" write 
    by * none 

所以,關於,登錄用戶與DN(whoami_s python-ldap),你可以確定用戶是否擁有一些權利。你不需要測試你是否可以編寫數據,在你的django應用程序中實現一個檢查DN的函數。

也許你是在說,ACL是dinamically生成的?


關於你的評論,如果你的ACL是靜態的,要知道ACL的,更簡單的辦法來實現蟒蛇設施誰是實現這些訪問控制列表。與我以前爲例:

W_ACCESS_OU = "ou=users_with_powerfull_write_access,dc=myproduct,dc=org" 
def check_write_access(user_dn): 
    return is_dn_base(W_ACCESS_OU, user_dn) 

現在,蟒蛇,LDAP無法檢索的slapd.conf的ACL ......它是不是安全解析的slapd.conf(因爲slapd.conf中可以「在任何地方「在系統和ACLs聲明可能很難分析),也需要花費很多時間來嘗試在LDAP後端寫入數據。

我知道這不是很滿意。另一個解決方案是使用「服務用戶」。只有此用戶對LDAP後端具有寫權限。

它簡化了ACL的寫作:

access to * 
    by dn.exact="cn=manager,dc=myproduct,dc=org" write 
    by * none 

然後,在普通用戶,您可以設置一個授權的標誌。 當您的登錄用戶想要做某件事時,您的應用程序會檢查該標誌。如果此標誌正常,則服務用戶將數據寫入後端。

這是我們在我們的應用程序中部署的策略。

在這兩種情況下,ACL的檢查都由我們的應用程序完成,而不是由ldap後端完成。

+0

對不起,我的理解可能會很慢,但是:如果我知道我的DN,我怎麼知道ACL? ACL在slapd.conf中定義,至少在概念上我的django應用程序是未知的。你是否建議我從django解析slapd.conf? – Isaac 2010-11-19 16:37:40

+0

要回答你的問題:我的ACL是靜態的。儘管如此,我可能會偶爾改變一些設置,所以我想有一個地方來定義它們。 – Isaac 2010-11-19 16:38:27

+0

@Isaac,我用更多的信息完成了我的答案 – ohe 2010-11-20 10:29:25

0

我想我會嘗試「測試」接近,如果它太慢也許有一些緩存。 我只想在ACL服務器上保留ACL定義的原因是,還有其他方法可以與服務器交互(將有cli工具和標準ldap工具),所以我想保留那些接口同步ACL明智,只有一個地方可以定義ACL