Django项目中添加ldap登陆认证功能的实现

setting配置

# settings配置
import ldap
from django_auth_ldap.config import LDAPSearch


AUTHENTICATION_BACKENDS = (
    # 配置为先使用LDAP认证,如通过认证则不再使用后面的
    'django_auth_ldap.backend.LDAPBackend',
    # 本地用户验证,如果不需要的,可以注释掉
    # 'django.contrib.auth.backends.ModelBackend',
)

base_dn = 'dc=xxx,dc=xxx,dc=com'    # ldap的域名信息(例如baidu.com,可以拆分为baidu跟com)
AUTH_LDAP_SERVER_URI = 'ldap://xxx.xxx.com:389'	# ldap服务器地址及端口
AUTH_LDAP_BIND_DN = 'CN=app dzkfyw001,OU=AppUsers,DC=xxx,DC=xxx,DC=com'    # 用户名,可以使用自己的用户名,用户名后面要加上域名
AUTH_LDAP_BIND_PASSWORD = 'xxx'    # 对应用户名的密码

# LDAPSearch
# 参数1:搜索的用户信息,ou是组织,后面格式化输出的是你的用户名信息,
# 参数2:默认,参数3:搜索的用户,我使用的user,有的公司是uid,如果不知道,可以尝试下
#默认不加ou就是默认搜索所有ou
AUTH_LDAP_USER_SEARCH = LDAPSearch('%s' % base_dn, ldap.SCOPE_SUBTREE, "(SamAccountName=%(user)s)")
AUTH_LDAP_ALWAYS_UPDATE_USER = True

# 如果ldap服务器是Windows的AD,需要配置上如下选项
AUTH_LDAP_CONNECTION_OPTIONS = {
    ldap.OPT_DEBUG_LEVEL: 1,
    ldap.OPT_REFERRALS: 0,
}

# 当ldap用户登录时,从ldap的用户属性对应写到django的user数据库,键为django的属性,值为ldap用户的属性
AUTH_LDAP_USER_ATTR_MAP = {
    "first_name": "givenName",
    "last_name": "sn",
    "email": "mail"
}

  

view.py认证:

def login(request):
    if request.method == 'POST':
        username = request.POST.get('username', None)
        password = request.POST.get('password', None)
        # 先验证ldap账户,如果不存在,则会验证本地用户
        ldap_user = authenticate(username=username, password=password)
        # 验证通过后,可以看到,本地auth_user表中,会自动添加一条同步的用户信息
        print("ldap_user: ",ldap_user)
        if ldap_user is not None:
            auth.login(request, ldap_user)
            request.session['user'] = username
            return HttpResponseRedirect(reverse("index"), {'user': ldap_user})
        else:
            return render(request, 'login.html', {"error": "用户或密码错误"})
    else:
        return render(request, 'login.html')

  

LDAP Admin工具:http://www.xitongzhijia.net/soft/208026.html

posted @ 2022-03-28 11:51  香菜哥哥  阅读(446)  评论(0编辑  收藏  举报