-
Notifications
You must be signed in to change notification settings - Fork 24
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
base: master
Are you sure you want to change the base?
Conversation
6bcbd50
to
1fe34fa
Compare
itou/www/signup/views.py
Outdated
@@ -266,6 +278,10 @@ class CompanyUserView(CompanyBaseView, TemplateView): | |||
|
|||
template_name = "signup/employer.html" | |||
|
|||
@login_not_required |
There was a problem hiding this comment.
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 😛)
There was a problem hiding this comment.
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 ?
There was a problem hiding this comment.
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. 🤷
There was a problem hiding this comment.
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 🙈
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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.
There was a problem hiding this 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.
itou/www/signup/views.py
Outdated
@@ -266,6 +278,10 @@ class CompanyUserView(CompanyBaseView, TemplateView): | |||
|
|||
template_name = "signup/employer.html" | |||
|
|||
@login_not_required |
There was a problem hiding this comment.
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.
210d8b1
to
d8d8806
Compare
06d23a9
to
9859c3b
Compare
7052636
to
c05550a
Compare
There was a problem hiding this 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 :)
f4b88bd
to
8c06da0
Compare
class LoginNotRequiredMixin: | ||
@classmethod | ||
def as_view(cls, *args, **kwargs): | ||
view = super().as_view(*args, **kwargs) | ||
return login_not_required(view) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍
There was a problem hiding this 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 ?
👍 pour les |
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 |
4680e16
to
ca11dc5
Compare
b0debd3
to
a87722f
Compare
Since LoginRequiredMiddleware now ensures that the user is authenticated
a87722f
to
e1afe78
Compare
🤔 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:
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 lelogin_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:unset_login_redirect
=> 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
🏝️ Comment tester
💻 Captures d'écran