【应用背景】
开发出来的web管理系统登录的时候,需要使用公司个人账户登录,那么就需要对接公司的ldap服务器,对接后想要每个人都有管理员权限。
Django的setting中配置:
import ldap
from django_auth_ldap.config import LDAPGroupQuery
from django_auth_ldap.config import LDAPSearch, GroupOfNamesType
from django.contrib.auth import authenticate
AUTHENTICATION_BACKENDS = (
'django_auth_ldap.backend.LDAPBackend',
'django.contrib.auth.backends.ModelBackend',
)
#ldap authentication
AUTH_LDAP_SERVER_URI = 'ldap://:xxx'
#AUTH_LDAP_SERVER_URI = 'ldap://:xxx'
AUTH_LDAP_BIND_DN = 'cn=kangli,ou=,dc=,dc=com'
AUTH_LDAP_BIND_DN = 'xx\\newthink.gen'
AUTH_LDAP_BIND_PASSWORD = "xx.xx"
#AUTH_LDAP_USER_SEARCH = LDAPSearch("OU=Employees,OU=xxUsers,DC=xx,DC=com", ldap.SCOPE_SUBTREE, "(cn=%s)")
AUTH_LDAP_USER_SEARCH = LDAPSearch("OU=Employees,OU=xxUsers,DC=xx,DC=com", ldap.SCOPE_SUBTREE, "(name=%(user)s)")
这样对接后用户无法登录,同步过来的用户没有管理员权限
原因是:is_staff=0,手工改成1后 用户就有管理员权限,所以需要代码中自动修改。
方法:
在应用/signals.py中
# 在你的应用的init.py文件中或者任何一个app的apps.py中
from django.dispatch import receiver
from django.db.models.signals import post_save
from django.contrib.auth.models import User
from django_auth_ldap.backend import LDAPBackend
@receiver(post_save, sender=User)
def set_user_staff(sender, instance, created, **kwargs):
if created:
instance.is_staff = True //修改成管理员了
instance.save()
在aaa的apps.py中
from django.apps import AppConfig
clyappConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField' //不需要改
name = 'myapp' //实际的应用的名字
def ready(self):
import aaa.signals //实际的名字