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にあるように、
とする。
例えば 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に追加していく。