7

PythonのLDAPモジュールを使用してLDAPサーバーに接続しています。データベースにクエリを実行することはできますが、データベースに存在するフィールドを取得する方法がわからないため、データベースを検索する前にユーザーに通知して、アクセスしようとしているフィールドがデータベースにないことをユーザーに通知できます。 。

たとえば、存在するフィールドが

cn
memberOf

ユーザーがフィルターを使用してデータベースにクエリを実行しようとした場合

cn and memberOf and notcontained

notcontained属性がdabaseスキーマにないことを知ることができるはずです。

どうすればこれを達成できますか。

ありがとう。

4

3 に答える 3

8

LDAPサーバーのスキーマを読み取る必要があります。

このコードは一時的なものとしてあなたのために働くかもしれません

#!/usr/bin/env python
#coding:utf-8
# Author:  peter --<pjl@hpc.com.py>
# Purpose: Tareas comunes a utilizar con respecto a schemas ldap
# Created: 01/05/12
import ldap
import ldap.schema



########################################################################
class SchemasIPA(object):

    __ldaps = ldap.schema

    #----------------------------------------------------------------------
    def __init__(self, url):
        """Constructor"""
        ldap._trace_level = 0
        ldap.set_option(ldap.OPT_DEBUG_LEVEL,0)
        subschemasubentry_dn, self.schema = ldap.schema.urlfetch(url,ldap._trace_level)
        self.oc_tree = self.schema.tree(ldap.schema.ObjectClass)        
        self.at_tree = self.schema.tree(ldap.schema.AttributeType)        

    def getobjectclasses(self):
        """
        trae la listas de objectclasses de un servidor dado
        """
        allobjc = {}
        for a in self.oc_tree.keys():
            objc = self.schema.get_obj(ldap.schema.ObjectClass, a)

            if objc != None:
                allobjc[objc.oid] = (objc.names, objc.must, objc.may, objc.sup, objc.obsolete)

        return allobjc

    def getatributes(self):
        """
        trae la lista de atributos de un servidor dado
        """
        allatt= {}
        o = []
        for a in self.at_tree.keys():
            att = self.schema.get_obj(ldap.schema.AttributeType, a)

            if att != None:
                allatt[att.oid] = (att.names, att.syntax, att.syntax_len, att.desc, att.collective, att.equality, att.single_value)

        return allatt

    def getvalidoid(self, objects):
        """
        retorno un valor oid libre valida para la creacion de esquemas y atributos
        el proceso valido es pedirle a la iana un oid valido, pero se tarda mas de un mes
        los oid a utilizar son valores predefinidos al momento de la instalacion del servidor ldap
        """
        pass

if __name__ == '__main__':
    sch = SchemasIPA('ldap://localhost')
    #at = sch.getatributes()
    ob = sch.getobjectclasses()

    for a, b in ob.iteritems():
        print a
        print b[0]

次に、このクラスを次のようにラップできます

#a file contained the above class
import schemas

olschemas = schemas.SchemasIPA(url='ldap://192.168.1.81')

#here are, some magic :)
pa = olschemas.schema.get_obj(olschemas._SchemasIPA__ldaps.ObjectClass, 'posixaccount')
pa.must #going to print all the attributes that can't be null's
pa.may #going to print all the attributes that are optional's
于 2013-05-15T05:10:57.217 に答える
3

スキーマのルートDSEと可能なベースDN

LDAPクライアントがスキーマで定義されている属性のみを考慮していると仮定すると(以下をextensibleObject参照)、attributeサーバースキーマで定義されているかどうかを判断するには、スキーマを取得します。多くのディレクトリサーバーでは、スキーマのベースDN(またはベースオブジェクト)はsubSchemaSubEntry、ルートDSEに存在する可能性のある属性で定義されます。ルートDSEの詳細については、「LDAP:ルートDSE」を参照してください。ルートDSEのコンテンツを取得するには、のベースオブジェクト''との検索スコープで構成されるサーバーに検索要求を送信し、とbaseで構成される要求された属性リストを送信します。*+

extensibleObject

objectClassの存在により、extensibleObjectLDAPクライアントは、FORTRANガベージ共通ブロックのように、必要な属性名と値を追加できます。つまり、属性はエントリに存在する可能性がありますが、スキーマでは定義されません。

subSchemaSubEntryが存在しません

属性が存在しない場合はsubSchemaSubEntry、サーバー管理者に連絡して、スキーマの取得に関する情報と、そのための十分なアクセス権を求めてください。

subSchemaSubEntryが存在します

属性が存在する場合は、属性の値をベースオブジェクトとしてsubSchemaSubEntry使用して検索要求をサーバーに送信し、の検索範囲ととに一致する要求された属性リストを使用して、スキーマを読み取ります。属性タイプの定義とobjectClassの定義は、スキーマに含まれています。subSchemaSubEntryone*+

于 2012-07-10T12:37:45.747 に答える
2

PythonのLDAPモジュールを使用してLDAPサーバーに接続しています。データベースにクエリを実行することはできますが、データベースに存在するフィールドを取得する方法がわからないため、データベースを検索する前にユーザーに通知して、アクセスしようとしているフィールドがデータベースにないことをユーザーに通知できます。 。

簡単な解決策は、結果からキーのリストを検索して印刷することです。

import ldap

# connect to your ldap server

some_dn = '...' # Your base dn
some_lookup = '...' # your lookup attr

result = conn.search_s(some_dn,ldap.SCOPE_SUBTREE,some_lookup)
result[0][1].keys()

たとえば、私のADサーバーに対して、次のように返されます。

['mailNickname',
 'publicDelegatesBL',
 'logonCount',
 'cn',
 'countryCode',
 'dSCorePropagationData',
 'objectClass',
 # ... many many more
'telephoneNumber',
'physicalDeliveryOfficeName',
'name',
'memberOf',
'codePage',
'userAccountControl',
'msExchMDBRulesQuota',
'lastLogon',
'protocolSettings',
'uSNChanged',
'sn',
'msExchVersion',
'mDBUseDefaults',
'givenName',
'msExchMailboxGuid',
'lastLogoff']
于 2012-07-10T13:01:43.603 に答える