Mon django modèle booléen variable ne fonctionne pas comme prévu en javascript
Voici le code dans mon base.html l'en-tête
<script>
var auth_status = "{{ user.is_authenticated }}"
</script>
{% block scripts %} {% endblock %}
Le reste des scripts de mon site sont dans le bloc de scripts.
Dans un template enfant (dans le bloc de script et à l'intérieur des balises de script), j'ai ce code,
if (auth_status) {
//something
}
L'erreur, à la main est auth_status est toujours Vrai, quand il doit être allumé et éteint en fonction de si l'utilisateur est connecté. Request_context est passé pour le modèle de sorte que ne devrait pas être l'erreur.
Grâce
- Sightly sans rapport avec votre question, mais sachez que de faire
if (user_is_authenticated) { do stuff; }
peut être un problème de sécurité si vous avez réellement se fier à la valeur de cette variable JS. Un utilisateur peut modifier la valeur de la variable JS avant l'exécution. - Donc, vous dites qu'un utilisateur peut en quelque sorte mis auth_status = true? Serait contournement de la js var-être une solution valable? Ex: si({{ utilisateur.is_authenticated|ouinon:"vrai", "faux" }}) par rapport à si(auth_status) ??
- Un utilisateur malveillant pourrait tirer juste le code source de votre page et remplacer ce qu'ils veulent... ce qu'ils veulent. Il y a n façon, vous pouvez appliquer tous sécurité côté client (qui est, en JS) et il y a pas de solution, tous les services de sécurité / contrôle d'accès doit être fait côté serveur (qui est dans votre code Python). JS n'est pas une extension de votre code d'application qui est exécutée de manière dynamique, c'est quelque chose de différent, avec des contraintes différentes.
- Attendre, de sorte que même de django reinhardt, les variables de modèle sont à risque de falsification? Serait une solution raisonnable à avoir quelque chose qui nécessite user_auth être un html POST?
- Tout dans le HTML qui est envoyé au client peut être gâché avec. Cela n'affectera pas le code côté serveur, en aucune façon, mais le HTML est envoyé au client et votre serveur est fait avec elle, c'est juste la façon dont il fonctionne. Concernant votre deuxième question, je ne sais pas ce que vous essayez de le faire, donc je ne peux pas vous en dire beaucoup plus.
- Ah ok, donc juste pour m'assurer que je comprends ce que vous dites, à l'aide de la balise de modèle {{ utilisateur.is_authenticated }} n'est pas utile parce que quelqu'un peut juste modifier cette valeur. Des trucs qui requiert une authentification doit être dans la forme de html des messages sur le serveur pour un contrôle d'authentification là?
- Oui, vous pouvez utiliser en toute sécurité
request.user.is_authenticated()
dans le code python. C'est OK pour utiliser{% if user.authenticated %}
dans le code du modèle, comme ce sera calculée côté serveur, c'est à dire avant le code HTML est envoyé au client. Le générique de la règle de base est que tout ce qui se trouve au client peut être modifié, tout ce qui n'arrive jamais à eux ne le peuvent pas. (Au moins, pas de cette façon 😉 )
Vous devez vous connecter pour publier un commentaire.
Pour ce que je vois votre
auth_status
variable semble être une chaîne de caractères, pas un booléen. Une variable avec une chaîne non vide sur javascript, évaluer àtrue
sur unif
clause.De toute façon, quelque chose comme
ne fonctionnera pas, parce que cela va générer ce code HTML:
Que Python est Vrai booléen est en majuscule.
Ceci devrait faire la traduction à partir de Python, Javascript:
Vérifier ouinon docs ici: https://docs.djangoproject.com/en/dev/ref/templates/builtins/#yesno
json
de vider votre Python valeurs dans un Javascript-safe represenation lorsque vous mettez d'abord les valeurs dans votrecontext
parce que vous ne pouvez pas être sûr dans le gestionnaire si il sera utilisé comme un JS de valeur ou de Python dans un Jinja modèle, par exemple. Si, dans mon Jinja modèle que je veux utiliser le code{% if myBool %}
, il ne fonctionnera pas correctement simyBool
a une valeur de chaîne au lieu d'un Python bool.Une autre option serait d'utiliser la jinja2
tojson
filtre:Vous pouvez également utiliser le
sûr
filtre en fonction de ce que vous êtes de passage: