【问题标题】:django User authentication via LDAPdjango 通过 LDAP 进行用户身份验证
【发布时间】:2019-10-25 10:01:46
【问题描述】:

我正在尝试通过 ldap 对照我们的 AD 检查我的 django 项目中的用户登录。 我在网上找到了很多教程,到目前为止我已经尝试过了。

由于某种原因,authenticate(username, password)-函数返回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-login-script,其工作原理就像一个魅力,所有的 DN、绑定和搜索都是相同的。

所以我的问题是:

哪里出了问题或者我错过了什么?

【问题讨论】:

    标签: python django active-directory ldap


    【解决方案1】:

    我强烈推荐使用django-python3-ldap。在尝试了其他包之后,我们已经在生产中使用了这个包多年,它可以工作,并且完全用 Python 3 编写:https://github.com/etianen/django-python3-ldap

    我们在端口 636 和 ldaps 上使用它,它也能正常工作。

    它使我们不必编写自己的自定义后端或登录方法;我们所要做的就是更改一些设置并编写format_username 函数。自述文件有关于连接到 Active Directory 的很好信息:我将从该配置开始,看看它是如何工作的。祝你好运!

    【讨论】:

    • 我会试一试的。谢谢
    • 感谢您的链接。经过settings.py 的一些测试后,它现在可以完美运行了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多