Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sécurité: activation de l'intergiciel LoginRequiredMiddleware #5178

Open
wants to merge 4 commits into
base: master
Choose a base branch
from

Conversation

xavfernandez
Copy link
Contributor

@xavfernandez xavfernandez commented Nov 29, 2024

🤔 Pourquoi ?

Pour avoir des vues protégées par défaut (en gardant en tête qu'être authentifié n'apporte aucune garantie, vu la facilité à se créer un compte).

🍰 Comment ?

Les débats à trancher:

  • pour les Class Based Views:

    • utilisation d'un décorateur sur le dispatch
    • ou définition/utilisation d'un mixin pour décorer dans as_view

    => la seconde solution me semble plus propre/claire

  • pour les vues utilisant un user_passes_test pour rediriger les utilisateurs loggés vers une autre vue: cela rentre en conflit avec l'intergiciel, qui utilise le login_url défini par ce décorateur pour rediriger lors de l'authentification ce qui n'est pas du tout ce que l'on souhaite:

    • soit utilisation de mon unset_login_redirect
    • soit redéfinition d'un décorateur maison qui fait le redirect
    • soit incorporation de ce check dans les différentes vues

    => je serais plutôt en faveur d'un décorateur maison qui aurait le mérite, comme user_passes_test actuellement de mettre en évidence les utilisateurs susceptibles d'accéder à cette vue)

🚨 À vérifier

  • Mettre à jour le CHANGELOG_breaking_changes.md ?

🏝️ Comment tester

Les instructions pour reproduire le problème, les profils de test, le parcours spécifique à utiliser, etc. Si vous disposez d'une recette jetable, mettre l'URL pour tester dans cette partie.

💻 Captures d'écran

@xavfernandez xavfernandez added the no-changelog Ne doit pas figurer dans le journal des changements. label Nov 29, 2024
@xavfernandez xavfernandez self-assigned this Nov 29, 2024
@xavfernandez xavfernandez force-pushed the xfernandez/LoginRequiredMiddleware branch from 6bcbd50 to 1fe34fa Compare December 2, 2024 09:22
itou/www/apply/views/process_views.py Outdated Show resolved Hide resolved
@@ -266,6 +278,10 @@ class CompanyUserView(CompanyBaseView, TemplateView):

template_name = "signup/employer.html"

@login_not_required
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

À se demander si on ne voudrait pas un LoginNotRequiredMixin ? (réponse C de la 1ere question 😛)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tu veux dire la réponse B/ce Mixin ?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oui, mis à part que j’aurais décoré dispatch pour être symmétrique avec le LoginRequiredMixin de Django. 🤷

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Alors oui et non.
Le LoginRequiredMixin fait des choses dans le dispatch.
Alors que le LoginNotRequiredMixin.dispatch ne ferait rien.
Le but est vraiment de mettre l'attribut login_required à False sur la vue retournée par as_view() pour que LoginRequiredMiddleware la laisse tranquille.
Et Django autorise de décorer la fonction dispatch mais à la fin il fait juste https://github.com/django/django/blob/5.1.3/django/views/generic/base.py#L115-L117 🙈

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 pour le mixin, je trouve que ça fait bizarre de devoir utiliser un décorateur sur une méthode très spécifique (et pas forcément surcharger) dans le cas des CBV.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hummm, merci pour l’explication. Dans ce cas, 2. (as_view) me semble également préférable.

Copy link
Contributor

@rsebille rsebille left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Vu qu'on à clairement plus de vue connectée que non-connectée ça me semble OK comme logique.

@@ -266,6 +278,10 @@ class CompanyUserView(CompanyBaseView, TemplateView):

template_name = "signup/employer.html"

@login_not_required
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 pour le mixin, je trouve que ça fait bizarre de devoir utiliser un décorateur sur une méthode très spécifique (et pas forcément surcharger) dans le cas des CBV.

itou/www/apply/views/process_views.py Outdated Show resolved Hide resolved
@xavfernandez xavfernandez force-pushed the xfernandez/LoginRequiredMiddleware branch 6 times, most recently from 210d8b1 to d8d8806 Compare December 3, 2024 12:45
@xavfernandez xavfernandez force-pushed the xfernandez/LoginRequiredMiddleware branch 3 times, most recently from 06d23a9 to 9859c3b Compare December 6, 2024 13:32
@xavfernandez xavfernandez force-pushed the xfernandez/LoginRequiredMiddleware branch 3 times, most recently from 7052636 to c05550a Compare December 10, 2024 12:58
Copy link
Contributor

@tonial tonial left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

C'est tellement cool que le middleware gère la vérification avant le setup des vues :)

@xavfernandez xavfernandez force-pushed the xfernandez/LoginRequiredMiddleware branch 5 times, most recently from f4b88bd to 8c06da0 Compare December 11, 2024 10:44
@xavfernandez xavfernandez marked this pull request as ready for review December 11, 2024 10:44
Comment on lines +21 to +25
class LoginNotRequiredMixin:
@classmethod
def as_view(cls, *args, **kwargs):
view = super().as_view(*args, **kwargs)
return login_not_required(view)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

Copy link
Contributor

@calummackervoy calummackervoy left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ça simplifie des choses ! 🧹

Je vois que t'as pris en compte les vues qu'on surcharge de django-allauth par example, et qu'ils utilisent @method_decorator(login_not_required, name="dispatch") sur leurs vues clés, comme email_verification_sent

T'as pris en compte l'impact sur les vues des autres dépendances ?

@EwenKorr
Copy link
Contributor

👍 pour les user.is_authenticated qui sautent !

@xavfernandez
Copy link
Contributor Author

xavfernandez commented Dec 12, 2024

T'as pris en compte l'impact sur les vues des autres dépendances ?

Bonne remarque et cela me fait me rendre compte qu'on importe beaucoup de vue de allauth (18 URLs) & anymail (24 URLs).

Je vais sûrement faire une autre PR pour en exposer un peu moins => c'est fait pour anymail: #5253

@xavfernandez xavfernandez force-pushed the xfernandez/LoginRequiredMiddleware branch 2 times, most recently from 4680e16 to ca11dc5 Compare December 12, 2024 13:54
@xavfernandez xavfernandez force-pushed the xfernandez/LoginRequiredMiddleware branch 2 times, most recently from b0debd3 to a87722f Compare December 19, 2024 09:57
@xavfernandez xavfernandez force-pushed the xfernandez/LoginRequiredMiddleware branch from a87722f to e1afe78 Compare December 23, 2024 10:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
no-changelog Ne doit pas figurer dans le journal des changements.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants