通过 LDAP 进行 django 用户身份验证
django User authentication via LDAP
我正在尝试通过 ldap 根据我们的 AD 检查我的 django 项目中的用户登录。
到目前为止,我在网上找到了很多教程。
出于某种原因 authenticate(username, password)
-函数 returns None
.
到目前为止,这是我的代码:
views.py(登录)
def login_view(request):
if not request.user.is_authenticated:
if request.method == 'POST':
login_form = Login_form(request.POST)
if login_form.is_valid():
username = login_form.data.get('username')
password = login_form.data.get('password')
domain_name = "@my.domain.com"
if domain_name not in username:
username += domain_name
try:
user = authenticate(username=username, password=password)
print(user) # this gives me None
if user is not None:
if user.is_active:
login(request=request, user=user)
return redirect('index')
else:
form = AuthenticationForm()
messages.error(request, 'Try again!')
return render(request, 'myapp/login.html', {'form': form})
except ldap.LDAPError as e:
print(e) # no error is displayed here
form = AuthenticationForm()
messages.error(request, 'Try again!')
return render(request, 'myapp/login.html', {'form': form})
### Some more funcs to
### redirect to login.html
### if the login fails
settings.py:
AUTHENTICATION_BACKENDS = (
'django_auth_ldap.backend.LDAPBackend',
)
AUTH_LDAP_SERVER_URI = "ldap://my.domain.com:389"
AUTH_LDAP_BIND_DN = "CN=Users,DC=my,DC=domain,DC=com"
AUTH_LDAP_BIND_PASSWORD = "" # I tried with blank password for anonymous bind or
# with "%(password)s" as template but I don't know if that's possible
# and also without the AUTH_LDAP_BIND_PASSWORD setting
AUTH_LDAP_CONNECTION_OPTIONS = {ldap.OPT_REFERRALS: 0}
AUTH_LDAP_USER_ATTR_MAP = {'group': "memberof", "first_name": "givenName", "last_name": "sn"}
AUTH_LDAP_USER_SEARCH = LDAPSearch("DC=my,DC=domain,DC=com,CN=Users",
ldap.SCOPE_SUBTREE, "(sAMAccountName=%(user)s)")
# since we need to login via username i need to search for username@my.domain.com
# so I try to search for sAMAccountName
不久前,我在 PHP 中编写了一个 LDAP 登录脚本,其效果非常好,所有 DN、绑定和搜索都是相同的。
所以我的问题是:
哪里出错了或者我错过了什么?
我强烈推荐使用 django-python3-ldap
。在尝试了其他包之后,我们已经在生产中使用了这个包多年,它有效,并且完全用 Python 3: https://github.com/etianen/django-python3-ldap
编写
我们在端口 636 和 ldaps
上使用它,它也能正常工作。
它使我们不必编写自己的自定义后端或登录方法;我们所要做的就是更改一些设置并编写 format_username
函数。自述文件提供了有关连接到 Active Directory 的有用信息:我将从该配置开始,看看它是如何工作的。祝你好运!
我正在尝试通过 ldap 根据我们的 AD 检查我的 django 项目中的用户登录。 到目前为止,我在网上找到了很多教程。
出于某种原因 authenticate(username, password)
-函数 returns None
.
到目前为止,这是我的代码:
views.py(登录)
def login_view(request):
if not request.user.is_authenticated:
if request.method == 'POST':
login_form = Login_form(request.POST)
if login_form.is_valid():
username = login_form.data.get('username')
password = login_form.data.get('password')
domain_name = "@my.domain.com"
if domain_name not in username:
username += domain_name
try:
user = authenticate(username=username, password=password)
print(user) # this gives me None
if user is not None:
if user.is_active:
login(request=request, user=user)
return redirect('index')
else:
form = AuthenticationForm()
messages.error(request, 'Try again!')
return render(request, 'myapp/login.html', {'form': form})
except ldap.LDAPError as e:
print(e) # no error is displayed here
form = AuthenticationForm()
messages.error(request, 'Try again!')
return render(request, 'myapp/login.html', {'form': form})
### Some more funcs to
### redirect to login.html
### if the login fails
settings.py:
AUTHENTICATION_BACKENDS = (
'django_auth_ldap.backend.LDAPBackend',
)
AUTH_LDAP_SERVER_URI = "ldap://my.domain.com:389"
AUTH_LDAP_BIND_DN = "CN=Users,DC=my,DC=domain,DC=com"
AUTH_LDAP_BIND_PASSWORD = "" # I tried with blank password for anonymous bind or
# with "%(password)s" as template but I don't know if that's possible
# and also without the AUTH_LDAP_BIND_PASSWORD setting
AUTH_LDAP_CONNECTION_OPTIONS = {ldap.OPT_REFERRALS: 0}
AUTH_LDAP_USER_ATTR_MAP = {'group': "memberof", "first_name": "givenName", "last_name": "sn"}
AUTH_LDAP_USER_SEARCH = LDAPSearch("DC=my,DC=domain,DC=com,CN=Users",
ldap.SCOPE_SUBTREE, "(sAMAccountName=%(user)s)")
# since we need to login via username i need to search for username@my.domain.com
# so I try to search for sAMAccountName
不久前,我在 PHP 中编写了一个 LDAP 登录脚本,其效果非常好,所有 DN、绑定和搜索都是相同的。
所以我的问题是:
哪里出错了或者我错过了什么?
我强烈推荐使用 django-python3-ldap
。在尝试了其他包之后,我们已经在生产中使用了这个包多年,它有效,并且完全用 Python 3: https://github.com/etianen/django-python3-ldap
我们在端口 636 和 ldaps
上使用它,它也能正常工作。
它使我们不必编写自己的自定义后端或登录方法;我们所要做的就是更改一些设置并编写 format_username
函数。自述文件提供了有关连接到 Active Directory 的有用信息:我将从该配置开始,看看它是如何工作的。祝你好运!