django-auth-ldap - отображение информации о пользователе из LDAP в пользовательском представлении
Я использую django-auth-ldap со следующими настройками, потому что на сервере ldap нет пользователя по умолчанию / global 'admin', он только для аутентификации пользователей, и сами пользователи могут видеть информацию о них.
AUTH_LDAP_BIND_AS_AUTHENTICATING_USER=True
в django-ldap-debug.log
я получаю следующую ошибку, когда (как зарегистрированный пользователь) звонит в поле зрения LDAPBackend().populate_user(request.user.username)
search_s('uid=vchrizz,ou=Users,dc=funkfeuer,dc=at', 0, '(objectClass=*)') raised NO_SUCH_OBJECT({'desc': 'No such object'},)
search_s('uid=vchrizz,ou=Users,dc=funkfeuer,dc=at', 0, '(objectClass=*)') returned 0 objects:
только при входе (используя login_required
от django.contrib.auth.decorators
) он возвращает объект пользователя, кажется:
search_s('uid=vchrizz,ou=Users,dc=funkfeuer,dc=at', 0, '(objectClass=*)') returned 1 objects: uid=vchrizz,ou=users,dc=funkfeuer,dc=at
тогда я заметил, мне нужно установить
AUTH_LDAP_BIND_DN
AUTH_LDAP_BIND_PASSWORD
чтобы избавиться от ошибки, но сначала я не хочу указывать пользователя с паролем (причина bind_as_authenticating_user
) и второй populate_user() по-прежнему возвращает NoneType
...
Зачем? как получить возвращенную информацию о пользователе из ldap?
Моя цель - отобразить всю пользовательскую информацию ldap, такую как uidNumber от ldap-user, в моем custom / userinfo / view. http://pastebin.com/VqGiwzFE
спасибо Крис
1 ответ
В конце auth.authenticate
пропал, и мне пришлось RTFM:
Хранение дополнительной информации о пользователях- это предпочтительный способ получения информации о пользователях вместо того, как я искал.
settings.py:
AUTH_LDAP_PROFILE_ATTR_MAP = {
"uid": "uid",
"cn": "cn",
"sn": "sn",
"givenName": "givenName",
"userPassword": "userPassword",
"shadowLastChange": "shadowLastChange",
"shadowMax": "shadowMax",
"shadowWarning": "shadowWarning",
"loginShell": "loginShell",
"uidNumber": "uidNumber",
"gidNumber": "gidNumber",
"homeDirectory": "homeDirectory",
"gecos": "gecos",
"mail": "mail",
"l": "l",
"telephoneNumber": "telephoneNumber",
}
AUTH_PROFILE_MODULE = 'myapp.UserProfile'
models.py:
from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
class UserProfile(models.Model):
# This field is required.
user = models.OneToOneField(User)
# Other fields here
uid = models.CharField(max_length=254)
cn = models.CharField(max_length=254)
sn = models.CharField(max_length=254)
givenName = models.CharField(max_length=254)
userPassword = models.CharField(max_length=254)
shadowLastChange = models.IntegerField(null=True)
shadowMax = models.IntegerField(null=True)
shadowWarning = models.IntegerField(null=True)
loginShell = models.CharField(max_length=254)
uidNumber = models.IntegerField(null=True)
gidNumber = models.IntegerField(null=True)
homeDirectory = models.CharField(max_length=254)
gecos = models.CharField(max_length=254)
mail = models.EmailField(max_length=254)
l = models.CharField(max_length=254)
telephoneNumber = models.CharField(max_length=254)
def create_user_profile(sender, instance, created, **kwargs):
#if created:
# UserProfile.objects.create(user=instance)
UserProfile.objects.get_or_create(user=instance)
post_save.connect(create_user_profile, sender=User)
views.py:
from django.contrib.auth.decorators import login_required
from django.http import HttpResponseRedirect
from django.shortcuts import render
from myapp.models import UserProfile
@login_required
def userinfo(request):
try:
ldapuserprofile = UserProfile.objects.get(uid=request.user.username)
except UserProfile.DoesNotExist:
return HttpResponseRedirect('/login/')
context = {'request': request, 'ldapuser': ldapuserprofile,}
return render(request, 'myapp/userinfo.html', context)
тогда в html шаблоне можно получить доступ {{ ldapuser.givenName }}
может быть, это кому-то поможет.
спасибо Крис