如何在Django视图中维护LDAP身份验证?

时间:2013-08-12 10:27:07

标签: python django authentication ldap

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

问题:

当我转到新视图,即着陆页时,我丢失了身份验证。当我追踪request.user时,我得到了我在创建Django项目时使用的管理员用户。我希望Django_auth生态系统可以为我做这一切,但也许我错了。

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

我很感激那些大师的帮助。

感谢。

使用实际代码进行编辑:

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))

2 个答案:

答案 0 :(得分:1)

您几乎肯定希望使用像django-auth-ldap这样的LDAP身份验证后端。如果后端已正确安装和配置,则您的视图不应要求任何特定于LDAP的代码。如果你已经纠结,不要害怕重新开始并从一开始就遵循后端的文档。

答案 1 :(得分:0)

现在您已经使用python-ldap手动实现了LDAP身份验证,所有您需要知道的是如何在不同的视图中使用会话。

幸运的是,Django提供了很好的文档:How to use sessions

示例代码:

request.session['name'] = 'Jack'  # set
name = request.session['name']    # get