2013-04-15 2 views
0

최근 한 LDAP 시스템에서 다른 LDAP 시스템으로 전환했습니다. 안타깝게도 LDAP 서버가 변경되었을뿐만 아니라 모든 사용자 이름도 변경되었습니다.사용자가 이미 존재하는지 확인하기 위해 django 신호 훅을 작성하십시오.

두 개의 LDAP 서버를 처리하기 위해 django_auth_ldap을 구성 할 수 있었지만 데이터베이스에서 새 사용자를 만들 수 없습니다.

청취자를 django_auth_ldap.backend.populate_user.connect에 연결하려고 시도했지만 그 신호는 사용자가 생성 된 after으로 평가됩니다.

는 그래서 어떻게 할 가장 좋은 방법입니다 :

  • 을 인증 사용자
  • 확인하는 경우 데이터베이스에서 사용자 이름
  • 확인 데이터베이스에 다른 이름
  • 업데이트 이름 경우에 필요한 (구 & 새로운 사용자 매핑 찾음)
  • 아무 곳이나 찾을 수 없다면 새로운 사용자 생성

EDIT 신호 처리기를 알고 있지만 중복 된 사용자 생성을 방지하는 작업을 해결하는 방법 (코드의 어디에서)을 모르겠습니다. 이전 코드와 새 사용자 이름을 확인하는 코드는 어디에 두어야합니까?

EDIT2 : 나는 다음에 시도했지만, 여전히 new_name 사용자가 생성되는

.

# touple of old user and new user names 
username_list = [('old_name', 'new_name') ] 

@receiver(pre_save, sender=User) 
def check_if_user_exists(sender, **kwargs): 
    try: 
     print "check_if_user_exists:" 
     user_instance = kwargs['instance'] 
     print user_instance 
     if any([x[1] == user_instance.username for x in username_list]): 
      print "new user name found!" 
      # get old username 
      user = User.objects.get(username = x[0]) 
      user.username = user_instance.username 
      return user 
     else: 
      print "user not found :(" 
    except ObjectDoesNotExist: 
     print ('user not found') 
     pass 
+0

이 링크는 도움이 되나요? https://docs.djangoproject.com/en/dev/ref/signals/#django.db.models.signals.pre_save? –

+0

@limelights 확신하지만, 그것은 신호 문서에 대한 링크 일 뿐이므로 도움이되지 않습니다. 구현과 관련하여 몇 가지 정보가 필요합니다. – memyself

답변

0

이렇게하면 pre_savesignal_handler을 구현하는 방법이다. 이들은 models.py에 있어야합니다.

@receiver(pre_save, sender=MyModel) 
def check_if_user_exists_based_on_whatever(sender, **kwargs): 
    try: 
     user = MyModel.objects.get(kwargs['instance'].<field_to_get_on_model>) 
     user.username = "new_username" 
     user.save() 
    except ObjectDoesNotExist: 
     user = MyModel.create(name="mymyself", lastname="andI") 

이것은 단지 기본적인 예일뿐입니다. 나는 모든 유효성 확인 로직을 실제로 알지 못합니다.^_^

+0

이것은 LDAP 바인딩과 통합되지 않지만 그 장애물을 능가 할 수 있다고 생각합니다. –

+0

그래서'MyModel' 대신'django.contrib.auth.models.User'를 사용할 수 있습니까? 나는'user'를 돌려 주어야합니까? – memyself

+0

예, 아니요. 당신은 아무것도 돌려 줄 필요가 없습니다. –

0

get_or_create_user을 덮어 쓰고 자체 인증 백엔드를 작성했습니다.

관련 문제