Ne peut pas créer de jeton CSRF avec Ressort de Sécurité
Je suis en utilisant le Printemps de Sécurité 3.2.3 dans mon Spring MVC de l'application et d'obtenir un comportement inattendu.
Selon la la documentation ici, il devrait être possible d'utiliser ${_csrf.token}
dans les balises meta de mon code html:
<meta name="_csrf" content="${_csrf.token}" />
<!-- default header name is X-CSRF-TOKEN -->
<meta name="_csrf_header" content="${_csrf.headerName}" />
D'où j'ai extrait la valeur de "contenu" à l'aide de JQuery et de le placer dans l'Entête de la Requête à l'aide d'AJAX.
Pour quelque raison que, le Printemps de Sécurité n'a pas de "convertir" cela en un réel jeton, il devient simplement envoyé dans l'en-tête comme une chaîne littérale "${_csrf.token}".
Essayer le trajet de l'aide ${_csrf.token}
dans un caché d'entrée en fonction de la documentation, j'ai ensuite essayé de vérifier ce que le jeton évalue par la vérification de la saisie de la valeur, mais il est encore juste en texte brut "${_csrf.token}".
Depuis, il semble que le Printemps de Sécurité n'est pas en effet, je suis pas certains type de configuration? Je suis actuellement en utilisant un barebones Printemps de Sécurité Java de configuration (par opposition à xml) comme indiqué ici:
import org.springframework.context.annotation.*;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.*;
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf();
}
}
Je sais configurer est appelé depuis que j'ai mis une version de débogage de déclaration en elle, donc je suppose que la protection CSRF est en effet activée car elle devrait être par défaut.
Je me rends compte que la syntaxe "${}" est l'Expression JSP le Langage, et je suis actuellement avec succès à l'aide d'évaluer le contexte dans un objet avec Thymeleaf, par exemple:
th:object="${context}"
Donc j'ai essayé d'ajouter "th:" en face de la balise meta "contenu" de la sorte:
<meta name="_csrf" th:content="${_csrf.token}"/>
Mais il en résulte une exception que cela ne peut pas être évalué:
Exception de l'évaluation de SpringEL expression: "_csrf.le jeton"
Je pense que la clé ici peut-être essayer de comprendre comment obtenir l'expression à évaluer correctement de mon point de vue.
Maintenant, le problème est qu'avec le Printemps de Sécurité en cours d'exécution, il fâcheusement veut authentifier l'utilisateur, même si nous avons déjà une méthode d'authentification mis en place déjà, si je reçois une erreur non autorisée. J'ai besoin de savoir comment contourner le Printemps de Sécurité de l'exigence de l'authentification qui est par défaut...il semble que pas de moyen simple de le désactiver, et si vous n'incluez pas la configuration de l'authentification, l'ensemble de l'application refuse de s'exécuter (affolant!). Je veux seulement le CSRF de la fonctionnalité de ce cadre! Continuera d'enquêter sur la façon de le contourner...
Ainsi, après des essais répétés, il semble que le Printemps de Sécurité fonctionne, mais encore j'ai juste une chaîne ${_csrf.token}. Je pense qu'il a à faire avec moi en utilisant un .fichier html lors de la JSP est nécessaire pour évaluer la valeur, mais de le changer pour un .fichier jsp résultats dans "org.thymeleaf.des exceptions.TemplateInputException: Erreur de la résolution du modèle {myapplication}, le modèle peut ne pas exister ou ne pas être accessible par toute de la configuration du Modèle de Résolveurs"
Juste pour dire que la
th:content="${_csrf.whateverProperty}"
forme dans les deux éléments META fonctionne pour moi. Printemps 4.1.x, Spring Security 4.0.x, Thymeleaf 2.1.x. Si j'utilise une propriété non valide nom-je obtenir SpelEvaluationException. Vous avait un problème de configuration au moment de la déclaration de l'origine du problème.OriginalL'auteur starmandeluxe | 2014-05-15
Vous devez vous connecter pour publier un commentaire.
J'ai enfin résolu ce problème, mais qu'il est fondamentalement nécessaire réécriture de la Sécurité Printemps. Ici, il est dans toute sa gloire.
Tout d'abord, j'ai suivi les suggestions de Eyal Lupu billet de blog très ici, mais j'ai dû l'adapter à ma situation parce que de mon AJAX exigence.
Comme pour le Thymeleaf situation, la clé de la friandise est caché dans les archives de la Thymeleaf forums Tristement célèbre Numéro 7.
https://github.com/thymeleaf/thymeleaf-spring/issues/7#issuecomment-27643488
Le dernier commentaire par le créateur de Thymeleaf dit lui-même:
Qui a été la clé de phrase-je besoin pour obtenir le jeton de travail. Malheureusement, c'est pas du tout évident pourquoi
th:action
serait également le coup d'envoi degetExtraHiddenFields
, mais en tout cas il le fait, et c'est ce qui compte.Donc, pour toute personne aux prises avec Thymeleaf + Ressort de Sécurité CSRF + AJAX POST, voici mes étapes (c'est à éplucher vers le bas un peu, mais ce sont des concepts de haut niveau pour le résoudre):
Mettre en œuvre le Printemps de l'interface RequestDataValueProcessor et de l'inscrire dans le Printemps de Sécurité XML de config de sorte que vous pouvez remplacer la méthode getExtraHiddenFields, ce qui vous permet d'insérer un champ caché dans le code HTML (avec le jeton de cours). Le jeton lui-même est généré avec un Java.Util UUID.
Avec JQuery, la lecture de la valeur à partir de ce champ caché et définir la Demande de l'en-Tête "X-CSRF Token" attribut de sorte qu'il est envoyé sur HTTP. Il n'est pas possible de simplement laisser le jeton dans le champ caché parce que nous ne faisons pas de la soumission d'un formulaire, au lieu de nous utiliser AJAX POST pour appeler des méthodes sur le côté serveur.
Étendre le Printemps HandlerInterceptorAdapter et l'enregistrer comme un intercepteur de sorte que chaque fois qu'une méthode POST est fait, les "preHandle" la méthode sur le côté serveur est appelé ainsi, on peut comparer le jeton de demande (extrait de l'en-tête HTTP dans l'étape précédente) à la session du jeton (doit être le même!). Après avoir fait cette vérification, il peut autoriser la demande de passer ou de retourner une erreur.
OriginalL'auteur starmandeluxe
J'ai commencé avec le même source de l'article comme vous, je pense, et le même ", vous devriez être en mesure" d'ajouter des réponses que vous avez fait. Je l'ai combattu d'une manière différente. J'ai fait Thymeleaf me donner la réponse que je voulais.
Thymeleaf mettre l'attribut "content" avec la demande de Printemps EL contenu. J'ai ensuite utilisé la condition JavaScript/JQuery pour extraire les informations des balises meta-tags directement dans le CSRF-tête.
OriginalL'auteur Tony Reynolds
Avant d'ajouter le thymeleaf-extras-springsecurity espace de noms et de sa dépendance dans mon projet, j'ai eu des problèmes similaires. Je n'ai jamais eu le meta tags de travailler, même avec thymeleaf-extras-springsecurity. Mais je n'ai réussi à récupérer le Printemps de Sécurité du jeton csrf à l'aide de l'caché d'entrée. J'ai les instructions ci-dessous qui fonctionnent pour moi:
Dans la balise html, ajouter:
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4"
Dans votre pom.xml (si vous utilisez Maven), vous devez ajouter la dépendance: thymeleaf-extras-springsecurity4.
Puis ajouter le caché d'entrée à l'intérieur de votre page de son corps pour récupérer le jeton csrf.
<input type="hidden" id= "csrf-token" th:name="${_csrf.parameterName}" th:content="${_csrf.token}" />
et ensuite l'utiliser dans votre javascript/jquery comme suit:
function f1() {
var token1 = $('input#csrf-token').attr("content");
...
$.ajax({
...
type: "POST",
beforeSend: function (request)
{
request.setRequestHeader("X-CSRF-TOKEN", token1);
},
...
Tout cela suppose que vous avez du printemps de sécurité est activée, et que vous n'avez PAS désactivé la protection csrf.
OriginalL'auteur Jon Engelbert
Vous avez une configuration incorrecte pour
springSecurityFilterChain
dans votre web.xml. Définition correcte est:Printemps de Sécurité utilise définir des filtres de servlet pour fournir les fonctionnalités qu'il offre (y compris la protection CSRF). Ces filtres sont définis comme des beans Spring (c'est à dire qu'ils sont instanciés et géré par le Printemps de contexte de l'application).
DelegatingFilterProxy
est un type spécial de filtre de servlet, qui trouve racine de contexte de l'application sur le régime enregistré d' servlet contexte et les délégués de chaque appel à la même nommé haricot.Voici une question: le Printemps de la Sécurité du travail si mon fichier de configuration est une classe Java, mais d'autres configurations sont faites dans le web.xml? Est-il nécessaire d'avoir seulement tous les XML de configuration, ou seulement tous-Java configuration?
Vous pouvez mélanger XML et Java de configuration comme vous le souhaitez. Bien sûr, vous devez regarder attentivement qui est de le charger. Problème peut se produire si vous essayez de mélanger configuration d'espace de noms (
<security:http>
spéciaux annotation de configuration (@EnableWebMvcSecurity
).Je n'étais pas en mesure d'obtenir le jeton CSRF à générer encore, MAIS j'ai été en mesure d'obtenir de Printemps de Sécurité en cours d'exécution (il n'était pas avant). Tout d'abord, avoir à la fois de Java et de configuration XML de configuration entraîne une exception java.lang.IllegalArgumentException: Attend à ne trouver qu'un seul haricot pour le type d'interface org.springframework.de sécurité.l'authentification.AuthenticationManager". Deuxièmement, avec le Java seule route, je n'avais qu'une classe Java (comme ci-dessus) pour configurer la Sécurité Printemps, alors qu'en réalité, vous avez besoin de 3! Voir ce lien: printemps.io/blog/2013/07/03/...
OriginalL'auteur Pavel Horal
Votre question en est une autre, juste trébuché à travers celui-ci en tant que bien et il m'a fallu plusieurs heures pour trouver la cause du problème. La cause du problème décrit par vous, c'est que vous n'avez pas activé csrf de soutien au sein de votre spring-security.xml
Ce petit extrait de besoins d'aller dans votre security-config.xml:
Gagner du temps en configurant correctement...
Cheerio,
Flo!
OriginalL'auteur kiteflo
Dans le cas où vous n'avez pas besoin d'utiliser Thymeleaf, je vous suggère le texte suivant:
Ajouter à la partie supérieure de votre page:
Ajouter à votre formulaire de connexion:
Ajouter ces dépendances pour votre pom.xml:
Après avoir lutté beaucoup, cela a fonctionné pour moi.
OriginalL'auteur Felipe Martins Melo