LDAP認証を組み込んでみる(その1)

http://nagosui.org/Nagosui/Misc/Turbogears/docs/1.0-b/IdentityManagementの最後からhttp://trac.turbogears.org/attachment/wiki/IdentityManagement/soldapprovider.pyを参照し、LDAPとの連携を考えてみる。

そのためには、Python-LDAPモジュールが必要になるので、あらかじめ取っておく。Windowsならhttp://www.agescibs.org/mauro/から。それ以外のOSなら、python-ldap — python-ldap 3.0.0 documentationから。

で、自前のものはhttp://achievewith.us/public/articles/2007/06/13/change-your-identity-in-turbogears-with-entry-pointsにあるように、

  1. プロジェクトのトップディレクトリにあるsetup.py に追記
  2. python setup.py develop
  3. config/app.cfg に追記

とする。

例えば tgassetというプロジェクトにsoldapprovider.pyという以下のファイルを置いているとする。
# controllers.pyと同じディレクトリに置いていると仮定する。

import ldap

from turbogears.identity.soprovider import *


class SoLdapIdentityProvider(SqlObjectIdentityProvider):
    """
    IdentityProvider that uses LDAP for authentication.
    """

    def __init__(self):
        super(SoLdapIdentityProvider, self).__init__()
        get = turbogears.config.get

        self.host = get("identity.soldapprovider.host", "localhost")
        self.port = get("identity.soldapprovider.port", 389)
        self.basedn  = get("identity.soldapprovider.basedn", "dc=localhost")
        self.autocreate = get("identity.soldapprovider.autocreate", False)

        log.info("host :: %s" % self.host)
        log.info("port :: %d" % self.port)
        log.info("basedn :: %s" % self.basedn)
        log.info("autocreate :: %s" % self.autocreate)

    def validate_password( self, user, user_name, password ):
        '''
        Validates user_name and password against an AD domain.
        
        '''
        
        ldapcon = ldap.open(self.host, self.port)
        filter = "(sAMAccountName=%s)" % user_name
        rc = ldapcon.search(self.basedn, ldap.SCOPE_SUBTREE, filter)
                            
        objects = ldapcon.result(rc)[1]

        if(len(objects) == 0):
            log.warning("No such LDAP user: %s" % user_name)
            return False
        elif(len(objects) > 1):
            log.error("Too many users: %s" % user_name)
            return False

        dn = objects[0][0]

        try:
            rc = ldapcon.simple_bind(dn, password)
            ldapcon.result(rc)
        except ldap.INVALID_CREDENTIALS:
            log.error("Invalid password supplied for %s" % user_name)
            return False

	return True

そして、「プロジェクトのトップディレクトリにあるsetup.pyに追記」

setup(
    name="soldap",
    version="0.1",
    entry_points="""
        [turbogears.identity.provider]
        soldap = tgasset.soldapprovider:SoLdapIdentityProvider
    """,
    )

次に「python setup.py develop」を実行する。
soldap.egg-infoというディレクトリが生成される。

最後に「config/app.cfgに追記」

identity.provider='soldap'

確認のために python start-xxxx.py で、サーバを起動する。
設定がNGだと、起動時にちゃんとエラーが出てくれる。

あとは、必要に応じて、identity.soldapprovider.* な設定をapp.cfgに追加していく。