2017-01-31 1 views
0

사용자 이름/비밀번호 방법에 대한 로그인 양식을 구현했으며 완벽하게 작동합니다.django-allauth - 중요한 로그인 필요 : 데이터베이스에 저장된 사용자 만 로그인 할 수 있습니다.

사용자가 소셜 계정을 사용하여 로그인 할 수도 있기를 바랍니다.

django-allauth를 사용하여 소셜 사용자를 django-users에 매핑합니다.

이제 모든 사람들이 아닌 장고 사용자에게 매핑되는 소셜 계정 만 로그인하고 싶습니다.

callback view을 재정의 할 수있는 방법이 있습니까? 아니면 다른 일을 할 수 있습니까?

+0

계정을 직접 만들어야하며 나중에 암호를 변경해야하는 등 등록을 단순히 해제 할 수 있습니까? 등록을 비활성화 할 수도 있지만 초대를 구현할 수 있습니다. 이것이 좋은 해결책이라면 세부 사항을 줄 수 있습니다. – dkarchmer

+0

예, 좋습니다. 계속해주십시오. –

답변

0

마침내 문서를 철저히 읽고 상당한 시련과 실수를 한 후에 내가 찾고있는 것에 도달했습니다.

docs에 지정된 구성의 일부로 다음 매개 변수를 설정해야했습니다.

ACCOUNT_EMAIL_REQUIRED (= 거짓)
사용자가 가입 할 때 이메일 주소를 넘겨 줄 필요가있다.

SOCIALACCOUNT_QUERY_EMAIL (= ACCOUNT_EMAIL_REQUIRED) 제 3 자 계정 공급자에서
요청 이메일 주소? 예 : OpenID AX 또는 Facebook "이메일"사용 권한을 사용합니다.

이메일 ID가 이미 등록되어 있는지 확인해야하므로 ACCOUNT_EMAIL_REQUIRED = True으로 설정해야했습니다.

그리고 마지막으로 아래에서와 같이 pre_social_login을 무시합니다.

from allauth.socialaccount.adapter import DefaultSocialAccountAdapter 

class NoNewSocialLogin(DefaultSocialAccountAdapter): 

    def pre_social_login(self, request, sociallogin): 
     try: 
      cr_user = auth_user.objects.get(email=sociallogin.user.email) 

      if cr_user and cr_user.is_active: 
       user_login = login(request, cr_user, 'django.contrib.auth.backends.ModelBackend') 
       raise ImmediateHttpResponse(HttpResponseRedirect(reverse('protect'))) 
      else: 
       raise ImmediateHttpResponse(render_to_response("account/authentication_error.html")) 
     except ObjectDoesNotExist as e: 
      raise ImmediateHttpResponse(render_to_response("socialaccount/authentication_error.html")) 
     except Exception as e: 
      raise ImmediateHttpResponse(HttpResponseRedirect(reverse('protect'))) 
1

등록을 단순히 해제하려면 기본 계정 어댑터를 덮어 써야합니다. 소셜 로그인도 지원하려면 기본 soculaaccount 어댑터를 덮어 써야합니다. 앱에 하나의 어딘가에 다음 코드를 추가합니다 (예 : adapter.py) :

from allauth.account.adapter import DefaultAccountAdapter 
from allauth.socialaccount.adapter import DefaultSocialAccountAdapter 
from allauth.exceptions import ImmediateHttpResponse 

class NoNewUsersAccountAdapter(DefaultAccountAdapter): 

    def is_open_for_signup(self, request): 
     return False 

class SocialAccountWhitelist(DefaultSocialAccountAdapter): 

    def pre_social_login(self, request, sociallogin): 
     u = sociallogin.user 
     print('User {0} is trying to login'.format(u.email)) 
     # Write code here to check your whitelist 
     if not_in_your_list(u): 
      raise ImmediateHttpResponse(HttpResponseRedirect('/account/login')) 

다음 설정에 다음을 추가 : 그 후

ACCOUNT_ADAPTER = 'path_to_app.adapter.NoNewUsersAccountAdapter' 
SOCIALACCOUNT_ADAPTER = 'path_to_app.adapters.SocialAccountWhitelist' 

, 당신은 수동으로를 작성하기 만하면 모든 관리자 페이지에서 계정을 만들고 수동으로 EmailAddress를 만듭니다. 소셜 로그인의 경우 전자 메일이 허용되는지 여부를 확인하기 위해 코드를 작성해야합니다.

사용자 이름, 전자 메일 및 이메일을 요청할 수있는 직원 전용 양식을 추가하는 것이 좋습니다. 심지어 암호) 다음

new_user = Account.objects.create_user(email=email, username=username, password=password) 
EmailAddress.objects.create(email=email, user=new_user, verified=True, primary=True) 

을 당신은 또한 초대 방식을 개발할 수 있습니다,하지만 훨씬 더 복잡하지만 빠르게 봤 나는 개인적으로 사용하지 않은 다음 프로젝트를 발견,하지만 당신이 필요 같습니다 :

https://github.com/bee-keeper/django-invitations

+0

답해 주셔서 감사합니다. 이것은 유망한 것으로 들립니다. 나는 곧 이것을 시도 할 것이다. 예, 저는 이미 사용자를 생성하기위한 직원 전용 양식을 개발했습니다. –

+0

이것은 유감스럽게도 데이터베이스에 저장된 모든 사용자를 차단합니다. –

+0

제안 사항이 있으십니까? 무엇을 읽어야합니까? [this] (http://stackoverflow.com/a/19232328/1936024) 대답이 내 마지막 수단입니다. –

관련 문제