Django: невозможно получить группы пользователей от пользователя LDAP

Мой проект Django (Django 1.11) использует django-auth-ldap 1.2 в качестве аутентификации.

У меня нет проблем с аутентификацией любой базы данных LDAP пользовательских агентов, используя:

@login_required(login_url='/accounts/login/')

и в этом случае любой пользователь из любой группы может войти на сайт.

Я хочу, чтобы только пользователь из «группы 1» мог получить доступ к веб-сайту. Я использовал код, указанный ниже

from django.shortcuts import render
from django.template import loader
from django.http import HttpResponse
from django.contrib.auth.decorators import login_required
from django.contrib.auth import views as auth_views
  @user_passes_test(
            lambda u: hasattr(u, 'ldap_user') and 'group1' in u.ldap_user.group_names,
            login_url='/accounts/login/')
    def index(request):
        template = loader.get_template('main/index.html')
        return HttpResponse(template.render()) 

Этот код не работает, и пользователь никогда не пройдет тест. Согласно типовым документам django-auth-ldap Document Я могу использовать ldap_user.group_names для получения имен групп пользователя.

Вот мои настройки ldap из settings.py:

import os
import django



AUTHENTICATION_BACKENDS = ('django_auth_ldap.backend.LDAPBackend',)

import ldap
from django_auth_ldap.config import LDAPSearch, GroupOfNamesType


AUTH_LDAP_SERVER_URI = "ldap://mydomain.com"

AUTH_LDAP_BIND_DN = "cn=admin,dc=mydomain,dc=com"

AUTH_LDAP_BIND_PASSWORD = "mypass"

AUTH_LDAP_USER_SEARCH = LDAPSearch("ou=ou_org_unit,dc=mydomain,dc=com",
ldap.SCOPE_SUBTREE, "(uid=%(user)s)")

AUTH_LDAP_GROUP_SEARCH = LDAPSearch("ou=ou_org_unit,cn=group1,cn=group2,dc=mydomain,dc=com",
    ldap.SCOPE_SUBTREE, "(objectClass=groupOfNames)"
)

AUTH_LDAP_GROUP_TYPE = GroupOfNamesType()

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

AUTH_LDAP_FIND_GROUP_PERMS = True
AUTH_LDAP_CACHE_GROUPS = True
AUTH_LDAP_GROUP_CACHE_TIMEOUT = 3600

Мой вопрос: почему я не могу аутентифицировать пользователя с помощью этого кода?


person Eyla    schedule 13.11.2017    source источник


Ответы (1)


Вы должны использовать AUTH_LDAP_REQUIRE_GROUP, если вы хотите ограничить вход в систему одной группой.

Вы также, вероятно, захотите использовать AUTH_LDAP_MIRROR_GROUPS чтобы все ваши группы LDAP автоматически загружались в вашу базу данных Django.

В качестве бонуса вы можете включить несколько групп в настройку AUTH_LDAP_REQUIRE_GROUP, используя класс LDAPGroupQuery. Например (взято из документации) :

from django_auth_ldap.config import LDAPGroupQuery

AUTH_LDAP_REQUIRE_GROUP = (
    (
        LDAPGroupQuery("cn=enabled,ou=groups,dc=example,dc=com") |
        LDAPGroupQuery("cn=also_enabled,ou=groups,dc=example,dc=com")
    ) &
    ~LDAPGroupQuery("cn=disabled,ou=groups,dc=example,dc=com")
)
person Joey Wilhelm    schedule 01.06.2018