IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Django Python Discussion :

limiter l'accès à une page web


Sujet :

Django Python

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut limiter l'accès à une page web
    Bonjour,


    Je souhaiterais que l'accès à une page du site internet soit limité à des utilisateurs possédant un login et un mot de passe (que je peux ajouter ou retirer sur la page administration)


    J'ai trouvé cette view et ce fichier html

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    def my_view(request):
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(username=username, password=password)
        if user is not None:
            if user.is_active:
                login(request, user)
                # Redirection vers une page de succès.
            else:
                # Renvoyer un message d'erreur 'compte inactif'.
        else:
            # Renvoyer un message d'erreur 'login invalide'.
     
     
     
    	{% if form.errors %}
    		<p class="error">Sorry, that's not a valid username or password</p>
    	{% endif %}
     
    	<form action='.' method='post'>
    		<label for="username">User name:</label>
    		<input tupe="text" name="username value="" id="username">
    		<label for="password">Password:</label>
    		<input type="password" name="password" value="" id="password">
     
    		<input type="submit" value="login" />
    		<input type="hidden" name="next" value="{{next|escape}}"/>
    	</form>
    Malheureusement, je ne vois pas comment les utiliser et surtout comment gérer le fichier urls.py.
    Aussi comment fonctionne "next"?
    Si vous pouviez me donner quelques pistes, ça m'aiderait déjà beaucoup.

    Merci beaucoup

  2. #2
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 535
    Points
    2 535
    Par défaut
    Il suffit que tu rajoutes un "decorator" à ta view. Ici la doc : http://docs.djangoproject.com/en/dev...ired-decorator

  3. #3
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    L'ajout d'un décorateur prédéfini type 'login-required' , protège l'accès contre les visiteurs non identifiés.
    En général c'est insuffisant. Il faut s'assurer qu'un utilisateur même identifié à accès uniquement aux données qui le concerne. Voici un exemple:
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #pour empecher le hacking
    def checkuser(request,number): #parametre number = identificateur de user
        utilisateur=request.user
        numero=utilisateur.id
        if(int(number)!=numero):
            return False
        else:
            return True
     
    @login_required
    def update_profil(request,idobj):
        if checkuser(request,idobj):
            return create_update.update_object(request,model=Profil,object_id=idobj,post_save_redirect='.')
        else:
            return HttpResponseRedirect('/accounts/login')
    Si la fonction de test checkuser doit être utilisée dans de nombreuses vues, on a alors tout intérêt à la transformer elle-même en un décorateur.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut identification
    La vue login_required m'a permis de rediriger la page sur l'url qui demande à l'utilisateur de s'identifier (username et password):

    http://127.0.0.1:8000/accounts/login...mu/Chromosome/

    Néanmoins, quand j'utilise mon nom et mon mot de passe de super-utilisateur, la page me renvoit "log in ou mot de passe incorrect".
    J'ai essayé de créer un nouvel utilisateur avec tous les droits sur l'administration django mais là encore son username et son password sont incorrects.

    Ensuite, j'ai essayé de le faire sur le prompt et ça m'a rendu ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    >>> from django.contrib.auth.models import User
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "C:\Python26\Lib\site-packages\django\contrib\auth\models.py", line 6, in <module>
        from django.db import models
      File "C:\Python26\Lib\site-packages\django\db\__init__.py", line 9, in <module>
        if not settings.DATABASE_ENGINE:
      File "C:\Python26\Lib\site-packages\django\conf\__init__.py", line 28, in __getattr__
        self._import_settings()
      File "C:\Python26\Lib\site-packages\django\conf\__init__.py", line 57, in _import_settings
        raise ImportError("Settings cannot be imported, because environment variable %s is undefined." % ENVIRONMENT_VARIABLE)
    ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is undefined.
    >>>
    Bref je vois pas comment faire pour qu'on m'accepte sur mon propre site...

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut remarques
    Quand je suis connecté sur l'admin de django, le decorator que j'ai ajouté "@login_required" ne me redirige pas sur la page qui demande de m'identifier.

    Par contre, que je sois ou non connecté sur l'administration du site, quand je suis sur la page qui demande mon nom et mon mot de passe, le résultat est toujours:
    Sorry, that's not a valid username or password

    Y a-t-il un lien entre les deux identifications (sur l'administration du site et ma vue login)?
    Et voyez-vous une solution pour que la page login accepte mes username et password de super-utilisateur?

  6. #6
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Néanmoins, quand j'utilise mon nom et mon mot de passe de super-utilisateur, la page me renvoit "log in ou mot de passe incorrect".
    J'ai déjà rencontré ce pb, sans pouvoir l'expliquer, avec le serveur de développement. Le fait de vider le cache du navigateur, d'interrompre le serveur et de le relancer m'a tiré d'affaire.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    j'ai fait ce que tu m'as dit mais ça n'a pas changé le problème, j'ai exactement la même situation.
    vider le cache sur mozilla firefox c'est bien outil/effacer mes traces/supprimer cache?

  8. #8
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 535
    Points
    2 535
    Par défaut
    Citation Envoyé par Zavonen Voir le message
    L'ajout d'un décorateur prédéfini type 'login-required' , protège l'accès contre les visiteurs non identifiés.
    En général c'est insuffisant. Il faut s'assurer qu'un utilisateur même identifié à accès uniquement aux données qui le concerne. ...
    Pourquoi réinventer la roue ? alors que ça existe aussi : http://docs.djangoproject.com/en/dev...ired-decorator

    De plus la demande initiale est :
    Je souhaiterais que l'accès à une page du site internet soit limité à des utilisateurs possédant un login et un mot de passe (que je peux ajouter ou retirer sur la page administration)
    Dans ce contexte le decorator login_required correspond à la demande.

  9. #9
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Pourquoi réinventer la roue ? alors que ça existe aussi : http://docs.djangoproject.com/en/dev...ired-decorator
    Désolé, pas vu....
    Tu pourrais être plus précis ?

  10. #10
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    vider le cache sur mozilla firefox c'est bien outil/effacer mes traces/supprimer cache?
    C'est bien ça, oui.
    Quand je suis connecté sur l'admin de django,
    Qu'est-ce que tu lis dans la barre d'adresse de firefox ?
    l'url de connexion de l'administrateur n'est pas .../accounts/login, mais il doit être reconnu quand même sur cette page.
    Sinon tu peux alller ouvrir directement la table auth_user dans ta BD, par contre les mots de passe sont codés. Si tu peux d'une façon ou d'une autre accéder à l'interface admin tu verras aussi le mot de passe codé et tu pourras comparer.
    Si tu ne peux pas t'en sortir et si tu n'as pas encore de données dans ta BD tu peux toujours la détruire et refaire une synchro

  11. #11
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 535
    Points
    2 535
    Par défaut
    Citation Envoyé par Zavonen Voir le message
    Désolé, pas vu....
    Tu pourrais être plus précis ?
    Django, pour chaque modèle, crée par défaut 3 autorisation : 'can add ...', 'can change ...' et 'can delete ...'.

    A chaque utilisateur que l'admin crée, il lui assigne des droits d'utilisation. Si pour un utilisateur donnée et pour un modèle donné, l'utilisateur n'a aps un des droits la console d'admin lui refuse l'accès.

    Ex :

    J'ai un modèle : Moto
    - Django à créer 3 autorisations : 'Can add moto', 'Can edit moto', 'Can delete moto'
    Je crée un nouvel utilisateur et ne lui les donne que les droits 'add' et 'change', il ne pourra supprimer aucun des éléments du modèle.

    Ceci est le comportement par défaut de la console d'admin.

    Il faut savoir qu'en plus des trois droits de bases, on peut définir autant de droits supplémentaires que l'on veut et ceci dans la définition du modèle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        class Meta:
            permissions = (
                ("can_drive", "Can drive"),
                ("can_vote", "Can vote in elections"),
                ("can_drink", "Can drink alcohol"),
            )
    A partir de ces nouveau droits, je peut pour chaque vue définir quels sont les droits nécéssaires pour qu'un utilisateur puisse accéder à la vue et ceci par un "decorator".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    from django.contrib.auth.decorators import permission_required
     
    def my_view(request):
        # ...
    my_view = permission_required('moto.can_drive', login_url='/loginpage/')(my_view)
    La limitation de django pour le moment, concernant les autorisations, c'est qu'elles sont applicables à l'ensemble du modèle et qu'il n'y à pas de mécanisme pour définir une permission par instances (ligne du modèle/table).

  12. #12
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Tout cela je le sais fort bien.
    Mais ces autorisations valent au niveau des tables.
    Supposons que les utilisateurs aient accès à la table moto et puissent créer des enregistrements, mais que par la suite tu veuilles que les utilisateurs n'aient accès qu'aux fiches moto qu'ils ont créées et à celles-là seulement. Le jeu standard des permissions de Django ne permet pas de gérer cette situation. Il faut aller chercher sur la fiche la clé étrangère du créateur et la comparer avec l'id de l'user, je ne sais pas faire cela plus simplement, mais si quelqu'un à une solution je suis preneur. "Ne pas réinventer la roue" a toujours été ma devise (c'est un peu pourquoi j'utilise Django).
    NB: Au niveau des requêtes tu peux facilement faire un filtre, mais cela ne marche pas non plus, parce que si tu veux 'tricher' (changer directement la barre d'adresse avec un autre identifiant, tu verras les motos des copains).
    Au fait, je suis motard (YAM TDM 900).

  13. #13
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 535
    Points
    2 535
    Par défaut
    Je ne conteste pas que cela ne fonctionne que pour les tables.

    Mais si on commence à répondre aux questions qui ne sont pas posées pas les utilisateurs du forum, ça ne va pas être simple !!

    La question initiale étais juste : afficher une page seulement si l'utilisateur à une compte.

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    ok c'est bon maintenant
    j'ai rien fait de spécial et ça marche...
    merci quoi qu'il en soit.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 30/07/2014, 11h44
  2. Fonctionnement d'un accès à une page web
    Par lamoua76 dans le forum Développement Web avec .NET
    Réponses: 1
    Dernier message: 25/08/2011, 20h27
  3. Problème d'accès à une page Web
    Par kareemb dans le forum Sécurité
    Réponses: 1
    Dernier message: 21/04/2009, 21h01
  4. [MySQL] bouton d'accès à une page web
    Par mohamed2006 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 08/02/2008, 18h44
  5. Réponses: 2
    Dernier message: 28/07/2006, 13h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo