2017-01-01 4 views
0

사용자가 비밀번호를 변경하면 일부 모델에서 일부 작업을 수행 할 수 있도록 신호를 보내려고합니다.Django에서 변경된 비밀번호 감지

어떻게 신호를 만들 수 있습니까?

나는 사용자의 post_save 신호 살펴 보았다 : 암호가 변경된 경우

post_save.connect(user_updated, sender=User) 

그러나, 내가 확인을 위해 거기에 아무것도 할 수없는 것 :

def user_updated(sender, **kwargs): 
    print(kwargs) # {'created': False, 'raw': False, 'instance': <User: 100002>, 'update_fields': None, 'signal': <django.db.models.signals.ModelSignal object at 0x7ff8862f03c8>, 'using': 'default'} 

또한 password_change_done 인증보기가 있지만 사용 방법을 잘 모르겠습니다. https://docs.djangoproject.com/en/1.10/topics/auth/default/#built-in-auth-views

아이디어가 있으십니까?

답변

5

pre_save 신호를 사용할 수 있습니다. kwargs['instance']는 업데이트 된 암호를 포함하고 당신은 아마도 인스턴스에 플래그를 설정합니다 set_password() 전화를 교차 할 수있는 사용자 지정 사용자 모델을 사용하는 경우에는 User.objects.get(id= user.id).password

@receiver(pre_save, sender=User) 
def user_updated(sender, **kwargs): 
    user = kwargs.get('instance', None) 
    if user: 
     new_password = user.password 
     try: 
      old_password = User.objects.get(pk=user.pk).password 
     except User.DoesNotExist: 
      old_password = None 
     if new_password != old_password: 
     # do what you need here 
+1

암호가 변경되면 소금이나 해시 알고리즘의 변경 사항을 감지합니다. 실제 암호 변경을 감지해야하는 경우 해시되기 전에보기에 연결하고 새 암호를 확인해야합니다. – knbk

+0

언제 소금이나 해시 알약을 바꿀 수 있습니까? 업그레이드 시나리오? – 43Tesseracts

+0

@ 43 최신 버전의 Django는 사용 된 암호 알고리즘/라운드를 업데이트하고, 사용자가 로그인하면 최신 버전을 사용하기 위해 암호를 업데이트합니다 –

0

으로 이전 암호를 얻을 수 있습니다, 다음 선택

from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin 
from django.db.models.signals import post_save 


class User(AbstractBaseUser, PermissionsMixin): 
    def set_password(self, password): 
     super(User, self).set_password(password) 
     self._set_password = True 

    @classmethod 
    def user_saved(cls, sender, instance, **kwargs): 
     if getattr(instance, '_set_password', False): 
      # Take action 


post_save.connect(User.user_saved, sender=User)