2016-09-13 6 views
1

Je souhaite que seuls les utilisateurs d'un e-mail @ companyname.net ou proviennent d'une liste d'adresses e-mail pour pouvoir se connecter avec Python Social Auth via google +. Comment pourrais-je accomplir cela?Django Python Social Auth permet uniquement à certains utilisateurs de se connecter

SOCIAL_AUTH_GOOGLE_OAUTH2_WHITELISTED_DOMAINS = ['companyname.net'] 

est ce que j'ai actuellement en settings.py, mais qui ne permet @ companyname.net-ers pour vous connecter.

+0

Cette liste vous dépend de domaine? Je veux dire, vous autorisez tous les e-mails provenant de domaines spécifiques ou seulement des adresses e-mail spécifiques? –

+0

Je veux autoriser ** tout le monde ** pour @ companyname.net et seulement certains autres spécifiques d'autres domaines. –

Répondre

1

Une façon de résoudre ce problème est PRÉPONDÉRANTS pipeline python-auth-sociale.

Vous pouvez remplacer create_user avec quelque chose comme:

def create_user(strategy, details, user=None, *args, **kwargs): 
    if user: 
     return {'is_new': False} 

    allowed_emails = get_list_of_emails() 

    fields = dict((name, kwargs.get(name, details.get(name))) 
        for name in strategy.setting('USER_FIELDS', USER_FIELDS)) 
    if not fields: 
     return 

    if fields[email] in allowed_emails:   
     return { 
      'is_new': True, 
      'user': strategy.create_user(**fields) 
     } 

    return 

Cette méthode get_list_of_emails() doit être utilisé comme un moyen de charger les e-mails à partir du fichier de base de données UO. Il doit retourner une liste d'emails.

Puis, dans le SOCIAL_AUTH_PIPELINE dans les paramètres que vous remplacez la create_user à votre méthode personnalisée:

SOCIAL_AUTH_PIPELINE = (
    'social.pipeline.social_auth.social_details', 
    'social.pipeline.social_auth.social_uid', 
    'social.pipeline.social_auth.auth_allowed', 
    'social.pipeline.social_auth.social_user', 
    'social.pipeline.user.get_username', 
    'path.to.my.method.create_user', 
    'social.pipeline.social_auth.associate_user', 
    'social.pipeline.social_auth.load_extra_data', 
    'social.pipeline.user.user_details', 
) 

De cette façon, vous pouvez garder la liste blanche de domais, puis stocker les e-mails que vous voulez un endroit où vous pouvez les charger avec la méthode get_list_of_emails()

plus sur le docs

+0

Je ne l'ai pas testé, mais cela devrait fonctionner. Déboguer pour voir si l'email est vraiment une clé de champs –

+0

Comment retourner l'utilisateur à une page spécifique si l'email de l'utilisateur n'est pas dans les messages autorisés? –

+0

Réglez simplement SOCIAL_AUTH_LOGIN_ERROR_URL, dans settings.py, sur l'URL à laquelle vous souhaitez que l'utilisateur soit redirigé –