0%

Django-LDAP统一认证

Django接入LDAP,实现用户身份认证

参考文档:

安装

1
pip install django-auth-ldap

配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# settings.py

# Django-auth-ldap 配置部分
import ldap
from django_auth_ldap.config import LDAPSearch, GroupOfNamesType, PosixGroupType

# 优先使用ldap进行用户验证
AUTHENTICATION_BACKENDS = [
'django_auth_ldap.backend.LDAPBackend',
'django.contrib.auth.backends.ModelBackend',
]
# LDAP 服务地址
AUTH_LDAP_SERVER_URI = configs['ldap']['ldhost']
# 管理员账号信息
AUTH_LDAP_BIND_DN = "cn=root,dc=vcg,dc=com"
AUTH_LDAP_BIND_PASSWORD = '*****'

# 用户搜索
AUTH_LDAP_USER_SEARCH = LDAPSearch(
"ou=People,dc=vcg,dc=com", ldap.SCOPE_SUBTREE, "(cn=%(user)s)"
)
# 或者 直接绑定,省略搜索过程
# 直接指定AUTH_LDAP_USER_DN_TEMPLATE来构造用户的DN信息,这里应该有占位符%(user)s
# 写法更高效
# AUTH_LDAP_USER_DN_TEMPLATE = "cn=%(user)s,ou=People,dc=vcg,dc=com"

# 建立用户模型和LDAP服务属性名(不区分大小写)的映射:
AUTH_LDAP_USER_ATTR_MAP = {
"first_name": "givenName",
"last_name": "sn",
"email": "mail",
}

# 组 搜索
AUTH_LDAP_GROUP_SEARCH = LDAPSearch(
"ou=Group,dc=vcg,dc=com", ldap.SCOPE_SUBTREE, "(objectClass=posixGroup)"
)
AUTH_LDAP_GROUP_TYPE = PosixGroupType(name_attr="cn")

#enbale组
AUTH_LDAP_REQUIRE_GROUP = "cn=vcg-tech,ou=Group,dc=vcg,dc=com"
#disabled组
# AUTH_LDAP_DENY_GROUP = "cn=disabled,ou=groups,dc=example,dc=com"

#分组权限分配:可登录、可登录后台、超级管理员
AUTH_LDAP_USER_FLAGS_BY_GROUP = {
"is_active": "cn=vcg-tech,ou=Group,dc=vcg,dc=com",
"is_staff": "cn=virgo-admin,ou=Group,dc=vcg,dc=com",
"is_superuser": "cn=virgo-admin,ou=Group,dc=vcg,dc=com",
}

AUTH_LDAP_MIRROR_GROUPS = True
# 如果为True,则每次用户登录时,将使用LDAP目录中的最新值来更新用户对象的字段。
# 否则,仅在自动创建用户对象时填充该用户对象。
AUTH_LDAP_ALWAYS_UPDATE_USER = True
AUTH_LDAP_FIND_GROUP_PERMS = True
# Cache distinguished names and group memberships for an hour to minimize
# LDAP traffic.
AUTH_LDAP_CACHE_TIMEOUT = 3600

# 日志
import logging

logger = logging.getLogger('django_auth_ldap')
logger.addHandler(logging.StreamHandler())
logger.setLevel(logging.DEBUG)

用户映射

默认使用AUTH_LDAP_USER_ATTR_MAP字段实现用户信息映射,如果需要额外的用户属性,需要配合使用django 的signals机制,实现用户信息的扩展。

需求:

用户通过ldap登录后,在User表中source字段记录为”LDAP”

代码:

signale.py
1
2
3
4
5
6
7
8
9
10
11
# 在app目录新建signale.py文件。

from django.dispatch import receiver
from django_auth_ldap.backend import LDAPBackend, populate_user


@receiver(populate_user, sender=LDAPBackend)
def auto_groups_upon_ldap(sender, **kwargs):
user = kwargs['user']
user.source = "LDAP"
user.save()
apps.py
1
2
3
4
5
6
7
8
9
10
11
from django.apps import AppConfig


class RbacConfig(AppConfig):
name = 'apps.rbac'
verbose_name = "RBAC"

# 新增以下内容

def ready(self):
from .signals import auto_groups_upon_ldap