8

Django Auth LDAP を使用してユーザーを認証する方法は 2 つあります。

  1. 検索/バインドおよび
  2. ダイレクトバインド。

最初の方法では、LDAP サーバーに匿名または固定アカウントで接続し、認証ユーザーの識別名を検索します。次に、ユーザーのパスワードを使用して再度バインドを試みることができます。

2 番目の方法は、ユーザー名からユーザーの DN を取得し、ユーザーとして直接バインドを試みることです。

アプリケーションにアクセスしようとしているユーザーのユーザー ID (sAMAccountName) とパスワードを使用して、直接バインドできるようにしたいと考えています。これを達成する方法があれば教えてください。現時点では、以下で説明する問題により、この作業を行うことができないようです。

私の場合、LDAP のユーザーの DN は次の形式です。

**'CN=Steven Jones,OU=Users,OU=Central,OU=US,DC=client,DC=corp'**

これは基本的に「CN=FirstName LastName,OU=Users,OU=Central,OU=US,DC=client,DC=corp」に変換されます。

これは、ユーザーのsAMAccountNameがsjonesであり、これがユーザー名 (%user) に対応するパラメーターであるため、Direct Bind を使用できないためです。適切なAUTH_LDAP_USER_DN_TEMPLATEを構成してユーザーの DN を取得する方法がわかりません。使用しています。

上記の問題により、今のところ Search/Bind を使用していますが、これにはAUTH_LDAP_BIND_DNおよびAUTH_LDAP_BIND_PASSWORDで指定する固定のユーザー資格情報が必要です。

これが私の現在のsettings.py構成です

AUTH_LDAP_SERVER_URI = "ldap://10.5.120.161:389"
AUTH_LDAP_BIND_DN='CN=Steven Jones,OU=Users,OU=Central,OU=US,DC=client,DC=corp'
AUTH_LDAP_BIND_PASSWORD='fga.1234'
#AUTH_LDAP_USER_DN_TEMPLATE = 'CN=%(user)s,OU=Appl Groups,OU=Central,OU=US,DC=client,DC=corp'
AUTH_LDAP_USER_SEARCH = LDAPSearchUnion(
    LDAPSearch("OU=Users, OU=Central,OU=US,DC=client,DC=corp",ldap.SCOPE_SUBTREE, "(sAMAccountName=%(user)s)"),
    LDAPSearch("OU=Users,OU=Regional,OU=Locales,OU=US,DC=client,DC=corp",ldap.SCOPE_SUBTREE, "(sAMAccountName=%(user)s)"),
    )
AUTH_LDAP_USER_ATTR_MAP = {"first_name": "givenName", "last_name": "sn","email":"mail"}
AUTH_LDAP_GROUP_SEARCH = LDAPSearch("CN=GG_BusinessApp_US,OU=Appl Groups,OU=Central,OU=US,DC=client,DC=corp",ldap.SCOPE_SUBTREE, "(objectClass=groupOfNames)")
AUTH_LDAP_GROUP_TYPE = GroupOfNamesType()
AUTH_LDAP_REQUIRE_GROUP = 'CN=GG_BusinessApp_US,OU=Appl Groups,OU=Central,OU=US,DC=client,DC=corp'

ここにいる素晴らしい人々からのガイダンスを楽しみにしています。

4

6 に答える 6

5

(これは実際には @amethystdragon の回答に対するコメントですが、コードの束であるため、別の回答として投稿します。) 問題は django_auth_ldap 1.2.5 にまだ存在するようです。これが更新されたパッチです。ソース コードを変更したくない、または変更できない場合は、モンキー パッチを適用できます。このコードを例に置くだけです。の終わりsettings.py。(そして、はい、モンキーパッチが醜いことは知っています。)

import ldap
from django_auth_ldap import backend

def monkey(self, password):
  """
  Binds to the LDAP server with the user's DN and password. Raises
  AuthenticationFailed on failure.
  """
  if self.dn is None:
    raise self.AuthenticationFailed("failed to map the username to a DN.")

  try:
    sticky = self.settings.BIND_AS_AUTHENTICATING_USER

    self._bind_as(self.dn, password, sticky=sticky)

    #### The fix -->
    if sticky and self.settings.USER_SEARCH:
      self._search_for_user_dn()
    #### <-- The fix

  except ldap.INVALID_CREDENTIALS:
    raise self.AuthenticationFailed("user DN/password rejected by LDAP server.")

backend._LDAPUser._authenticate_user_dn = monkey
于 2015-03-12T19:54:01.243 に答える