Beispiel #1
0
def init_app(sender, **kwargs):
    """
    Синхронизация организаций с LDAP базой арбикон
    """
    print 'Init arbicon module'
    ldap_connection = LdapConnection(settings.LDAP)
    ldap_work = LdapWork(ldap_connection)
    print '\t Import organisations from ldap...'
    for org in  ldap_work.get_org_by_attr(node='.'):
        try:
            organistion = Organisation.objects.get(name=org.o[0:255])
        except Organisation.DoesNotExist:
            organistion = Organisation(name=org.o[0:255])
            organistion.save()

        for member in org.member_of:
            try:
                group = Group.objects.get(name=(group_prefix + member.lower()))
            except Group.DoesNotExist:
                group = Group(name=(group_prefix + member.lower()))
                group.save()
            try:
                og = OrganisationGroups.objects.get(organistion=organistion, group=group)
            except OrganisationGroups.DoesNotExist:
                og = OrganisationGroups(organistion=organistion, group=group)
                og.save()
    print '\t Import organisations from ldap complete.'
    def get_or_create_user(self, username, password):
        """
            Функция принимает имя пользователя и пароль. Если на LDAP сервере существует
        подходящий пользователь - проверяется его наличие в локальной базе, если в 
        базе его не оказалось, то пользователь создается в локальной базе(синхронизация 
        с LDAP пользователем) и возвращается как User, попутно присваивая ему группу 
        для доступа к функциям сайта.
            Если пользователя не существует в LDAP, но существует в локальной базе,
        проверяем его на принадлежность к супер админу, если супер админ, то логиними
        если не супер админ - удаляем.
        """




        ldap_connection = LdapConnection(settings.LDAP)
        ldap_work = LdapWork(ldap_connection)


        # Филтр запроса на получение объета пользователя
        # filter = '(&(uid=%s)(objectClass=RUSLANperson)(userPassword=%s))' % (username, password)
        # аттрибуты, которые будут извлечены для обработки
        # attrs = ['uid','sn','memberOf','userPassword','mail','telephoneNumber']

        # ldap_results = ldap_connection.search_s( settings.LDAP_BASE_DN, ldap.SCOPE_SUBTREE, filter, attrs )
        ldap_users = ldap_work.get_users_by_attr(username=username, password=password)

        # если пользователь не существет в LDAP
        # проверяем, существует ли он в локальной базе
        # если да, то удаляем его
        if not ldap_users:
            try:
                user = User.objects.get(username=(username + username_postfix))
#                if user.is_superuser:
                if user.check_password(password):
                    return user
#                user.delete()
            except User.DoesNotExist:
                pass
            return None

        user = None
        try:

            user = User.objects.get(username=(username + username_postfix))

        except User.DoesNotExist:

            ldap_user = ldap_users[0]

            user_name = ldap_user.name.split()
            first_name = u''
            last_name = u''

            if len(user_name) == 3:
                first_name = (user_name[1] + u' ' + user_name[2])[0:30]
                last_name = user_name[0][0:30]
            elif len(user_name) == 2:
                first_name = user_name[1][0:30]
                last_name = user_name[0][0:30]
            elif len(user_name) == 1:
                last_name = user_name[0][0:30]

            user = User(username=(ldap_user.uid + username_postfix), email=ldap_user.email, first_name=first_name, last_name=last_name)

            user.is_superuser = False
            user.set_password(password)
            user.save()

            groups = []
            for member in ldap_user.member_of:
                try:
                    group = Group.objects.get(name=(group_prefix + member.lower()))
                except Group.DoesNotExist:
                    group = Group(name=(group_prefix + member.lower()))
                    group.save()

                groups.append(group)

            user.groups = groups




            orgs = []
            if len(ldap_user.dn) > 3:
                orgs = ldap_work.get_org_by_attr(o=ldap_user.dn[1],node='.')

            if orgs:
                org = orgs[0]
                try:
                    organistion = Organisation.objects.get(name=org.o[0:255])
                except Organisation.DoesNotExist:
                    organistion = Organisation(name=org.o[0:255])
                    organistion.save()

                #groups = []
                for member in org.member_of:
                    try:
                        group = Group.objects.get(name=(group_prefix + member.lower()))
                    except Group.DoesNotExist:
                        group = Group(name=(group_prefix + member.lower()))
                        group.save()

                    if group not in groups:
                        groups.append(group)

                    try:
                        og = OrganisationGroups.objects.get(organistion=organistion, group=group)
                    except OrganisationGroups.DoesNotExist:
                        og = OrganisationGroups(organistion=organistion, group=group)
                        og.save()

                try:
                    organistion_user = OrganisationUser.objects.get(organistion=organistion , user=organistion)
                except OrganisationUser.DoesNotExist:
                    organistion_user = OrganisationUser(organistion=organistion, user=user)
                    organistion_user.save()
                    user.groups = groups

        users_group = Group.objects.get_or_create(name='users')
        user.groups.add(users_group[0])
        return user