0

问题

据我所知,django-auth-ldap根据我的配置,我正在做我需要的一切。除了它无法建立从 ldap 组到 django 组的映射。

我在 ldap 中有一个名为 的组dev,即cn=dev. 我在 django 也有一个小组,叫做dev. uid=fkilibarda当我在 Django ( )中使用我的用户登录时,django-auth-ldap能够获取我的名字、姓氏和电子邮件,但无法将我添加到dev组中。

调试

django_auth_ldap.backend线路:203

def get_group_permissions(self, user, obj=None):                            
   if not hasattr(user, 'ldap_user') and self.settings.AUTHORIZE_ALL_USERS:
       _LDAPUser(self, user=user)  # This sets user.ldap_user              

   if hasattr(user, 'ldap_user') and (user.ldap_user.dn is not None):      
       return user.ldap_user.get_group_permissions()                       
   else:                                                                   
       return set()

我发现这hasattr(user, 'ldap_user')总是错误的。因此,user.ldap_user.get_group_permissions()永远不会运行,这就是永远不会建立组映射的原因。

我只是不明白上面的意义。user为什么没有ldap_user属性?

配置

MIDDLEWARE = [
    'debug_toolbar.middleware.DebugToolbarMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

AUTHENTICATION_BACKENDS = {
    'django_auth_ldap.backend.LDAPBackend',
    'django.contrib.auth.backends.ModelBackend',
}

# ===================
# LDAP configurations
# ===================

AUTH_LDAP_SERVER_URI = "example_server"

AUTH_LDAP_GROUP_SEARCH = LDAPSearch(
    'ou=group,dc=example,dc=example,dc=com',
    ldap.SCOPE_SUBTREE,
    '(objectClass=posixGroup)',
) 
AUTH_LDAP_GROUP_TYPE = GroupOfNamesType()

AUTH_LDAP_USER_FLAGS_BY_GROUP = {
    'is_active': 'cn=dev,ou=group,dc=example,dc=example,dc=com',
    'is_staff': 'cn=dev,ou=group,dc=example,dc=example,dc=com',
    'is_superuser': 'cn=dev,ou=group,dc=example,dc=example,dc=com',
}

AUTH_LDAP_USER_SEARCH = LDAPSearch(
    'ou=people,dc=example,dc=example,dc=com',
    ldap.SCOPE_SUBTREE,
    '(uid=%(user)s)'
)

AUTH_LDAP_USER_ATTR_MAP = {
    "first_name": "givenName", 
    "last_name": "sn", 
    "email": "mail"
}

AUTH_LDAP_FIND_GROUP_PERMS = True
AUTH_LDAP_ALWAYS_UPDATE_USER = True

版本

django-auth-ldap==1.2.14 python3

4

1 回答 1

2

原来我想念理解是如何django_auth_ldap工作的。我预计,当 时AUTH_LDAP_FIND_GROUP_PERMS = True,我的用户将根据我在 LDAP 中的组成员身份添加到 Django 中的适当组中。

因此,如果用户是LDAPfkilibarda中组的成员,那么我认为该用户会自动添加到Django 中的组中。devfkilibardadev

相反,对于用户在 Django 中发出的每个请求,django_auth_ldap都会向 LDAP 发送一个请求,以确定用户应该获得哪些组/权限。这显然是更好的方法......

所以如果你正在测试这个:

  1. 不要期望用户被添加到 Django 中的组中。
  2. 测试时不要使用超级用户,因为超级用户可以访问所有内容。

django_auth_ldap 文档实际上非常清楚地描述了这一点

于 2017-11-01T00:39:42.037 回答