首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在django中实现ldap身份验证(没有管理凭据)

如何在django中实现ldap身份验证(没有管理凭据)
EN

Stack Overflow用户
提问于 2020-06-07 17:23:36
回答 1查看 3.9K关注 0票数 6

我的设置: Django-3.0,Python-3.8,django_auth_ldap

我的组织中有LDAP服务器()。我正在构建一个Django应用程序,它为所有用户提供一些操作。

我知道Django有内置的用户身份验证机制,但是它可以验证用户是否存在于用户模型数据库中。

,但我的要求是.

所有用户条目都在LDAP服务器()中。使用适当的用户凭据,LDAP服务器将对我进行身份验证。

我在Django 'accounts'应用程序中创建了登录页面,

当我从登录页输入用户名和密码时,

  1. 应该使用Organization服务器进行身份验证。登录后的
  2. 必须将登录用户的会话保存5分钟。(姜戈第四届会议)

我看到django_auth_ldap包为我的目的提供了一些见解。

我在settings.py.里有这些内容

代码语言:javascript
复制
import ldap

##Ldap settings
AUTH_LDAP_SERVER_URI = "ldap://myldapserver.com"
AUTH_LDAP_CONNECTION_OPTIONS = {ldap.OPT_REFERRALS : 0}
AUTH_LDAP_USER_DN_TEMPLATE = "uid=%(user)s, OU=USERS,dc=myldapserver, dc=com"
AUTH_LDAP_START_TLS = True

#Register authentication backend
AUTHENTICATION_BACKENDS = [
            "django_auth_ldap.backend.LDAPBackend",

            ]

views.py中调用身份验证。

代码语言:javascript
复制
from django_auth_ldap.backend import LDAPBackend
def accounts_login(request):
    username = ""
    password = ""
    if request.method == "POST":
        username = request.POST.get('username')
        password = request.POST.get('password')
        auth = LDAPBackend()
        user = auth.authenticate(request, username=username, password=password)
        if user is not None:
            login(request, user)
            return redirect("/")
        else:
            error = "Authentication Failed"
            return render(request, "accounts/login.html", 'error':error)

    return render(request, "accounts/login.html")

但是,使用上述方法总是无法通过LDAP服务器进行身份验证。

如果我使用普通python ()进行调用,那么身份验证在同一个simple_bind_s服务器上运行良好。

代码语言:javascript
复制
import ldap
def ldap_auth(username, password):
    conn = ldap.initialize(myproj.settings.LDAP_AUTH_URI)
    try:
        ldap.set_option(ldap.OPT_REFERRALS, 0)
        #ldap.set_option(ldap.OPT_PROTOCOL_VERSION, 3)
        conn.simple_bind_s(username, password)
    except ldap.LDAPError as e:
        return f'failed to authenticate'

    conn.unbind_s()
    return "Success"

有人能建议我按照我的要求使LDAPBackend认证工作吗?

注意:我没有LDAP服务器的管理权限。

EN

回答 1

Stack Overflow用户

发布于 2020-08-20 17:16:19

这就是我在ldap3和没有django_auth_ldap包的情况下所做的。

1-在AuthenticationBackend中创建自定义your_app/backends.py

代码语言:javascript
复制
import logging

from ldap3 import Server, Connection
from ldap3.core.exceptions import LDAPBindError

from django.conf import settings
from django.contrib.auth import get_user_model



logger = logging.getLogger(__name__)
UserModel = get_user_model()


class LDAPBackend:

    def authenticate(self, request, username=None, password=None, **kwargs):
        # set username to lowercase for consistency
        username = username.lower()
        # get the bind client to resolve DN
        logger.info('authenticating %s' % username)
        # set your server
        server = Server(settings.LDAP_HOST, get_info=ALL)
        try:
            conn = Connection(server, f"{username}@{settings.LDAP_DOMAIN}", password=password, auto_bind=True)
        except LDAPBindError as e:
            logger.info('LDAP authentication failed')
            logger.info(e)
            return None
        user = UserModel.objects.update_or_create(username=username)
        return user

    def get_user(self, user_id):
        try:
            return UserModel._default_manager.get(pk=user_id)
        except UserModel.DoesNotExist:
            return None

2-在LDAPBackend中将settings.py声明为身份验证后端

代码语言:javascript
复制
AUTHENTICATION_BACKENDS = [
    'your_app.backends.LDAPBackend', 
    'django.contrib.auth.backends.ModelBackend'
]

这允许您使用django的本机函数进行身份验证,并且它与admin一起工作。

若要使会话仅工作5分钟,请将此设置添加到settings.py文件中:

代码语言:javascript
复制
SESSION_COOKIE_AGE = 5 * 60

让我知道它是否适合你的。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62249059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档