Skip to main content
 首页 » 编程设计

python之如何跨 Django View 维护 LDAP 身份验证

2024年11月01日25wuhuacong

这是目前的情况: 我创建了一个 login.html 页面,我在其中以表格形式输入我的用户名和密码。在我的 views.py 中,我获取 POST 数据并使用用户名和密码对我的 LDAP 服务器进行身份验证(机制有效)。如果用户名/密码错误,我将被重定向回登录页面并显示错误消息。否则,我将被重定向到一个登陆页面,我将在该页面上看到如下消息:“Hello Lastname, Firstname”。我能够从 LDAP 查询中获取名字和姓氏。

问题:

当我转到新 View (即登录页面)时,我失去了身份验证。当我跟踪 request.user 时,我得到了我在创建 Django 项目时使用的管理员用户。我希望 Django_auth 生态系统为我做所有这些,但也许我错了。

我不确定是否应该将用户置于 session 中,因为我在 Google 上找不到人们一起使用 Django 的 LDAP 和 session 的任何地方。

我将不胜感激专家们的任何帮助。

谢谢。

用实际代码编辑:

def login(request): 
    error = False 
    DN = 'None' 
    user = 'None' 
    user_attr = 'None' 
    if request.method == 'POST': #if form has been submitted 
        DN = request.POST['login'] 
        PWD = request.POST['password'] 
        DN_FULL_EMAIL = DN + '@'+user_domain+'.mysite.com' 
        print 'DN_FULL_EMAIL', DN_FULL_EMAIL 
        try: 
            l = ldap.initialize('ldap://mysite.com:3268') 
            print 'bind_res = ' , l.simple_bind_s(DN_FULL_EMAIL, PWD) 
            BASE_DN = 'DC=eng,DC=mysite,DC=com' 
            SCOPE = ldap.SCOPE_SUBTREE 
            Filter = '(&(objectClass=person)(sAMAccountName='+DN+'*)(objectClass=organizationalPerson)(objectClass=user))' 
            Attrs = ['displayName', 'employeeID'] #The only data we need 
 
            r= l.search_ext(BASE_DN, SCOPE, Filter, Attrs) 
            Type, user = l.result(r,10) 
            if user : 
                Name, Attrs = user[0] 
                if hasattr(Attrs, 'has_key') and Attrs.has_key('displayName') and Attrs.has_key('employeeID'): 
                    displayName = Attrs['displayName'][0] 
                    WWID = Attrs['employeeID'][0] 
                request.user = user 
                user_attr = Attrs 
                return HttpResponseRedirect('/', {  'user' : user, 
                                                    'user_attr' : user_attr 
                                                }) 
 
        except ImportError: 
            error = True 
            pass 
        except ldap.INVALID_CREDENTIALS: 
            error = True 
            pass 
    return render_to_response( 'login.html', { 
        'error' : error, 
        'user' : user, 
        'user_attr' : user_attr 
        }, context_instance = RequestContext(request)) 

请您参考如下方法:

您几乎肯定想使用像 django-auth-ldap 这样的 LDAP 身份验证后端.如果后端安装和配置正确,您的 View 应该不需要任何特定于 LDAP 的代码。如果您遇到了麻烦,请不要害怕重新开始并从头开始遵循后端的文档。