Je vois cela dans mes applications Spring MVC web.xml
:
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
J'essaie de comprendre pourquoi c'est là et si c'est vraiment nécessaire.
J'ai trouvé cette explication dans la documentation de Spring mais cela ne m'aide pas à comprendre:
Il semble suggérer que ce composant est le "ciment" entre les servlets définis dans web.xml
et les composants définis dans Spring applicationContext.xml
.
7.1 DelegatingFilterProxy
Lorsque vous utilisez des filtres de servlet, vous devez évidemment les déclarer dans votre
web.xml
, sinon ils seront ignorés par le conteneur de servlet. Dans Spring Security, les classes de filtre sont également des beans Spring définis dans le contexte de l'application et donc capables de tirer parti des riches fonctionnalités d'injection de dépendances et des interfaces de cycle de vie de Spring. Spring'sDelegatingFilterProxy
fournit le lien entreweb.xml
et le contexte de l'application.Lorsque vous utilisez DelegatingFilterProxy, vous verrez quelque chose comme ceci dans le
web.xml
fichier:<filter> <filter-name>myFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>myFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Notez que le filtre est en fait un
DelegatingFilterProxy
, et non la classe qui implémentera réellement la logique du filtre. Ce quiDelegatingFilterProxy
fait est de déléguer les méthodes du filtre à un bean qui est obtenu à partir du contexte d'application Spring. Cela permet au bean de bénéficier de la prise en charge du cycle de vie du contexte de l'application Web Spring et de la flexibilité de configuration. Le bean doit implémenterjavax.servlet.Filter
et il doit avoir le même nom que celui de l'élément filter-name. Lisez le Javadoc pour DelegatingFilterProxy pour plus d'informations
Donc, si je retire cela de mon web.xml
, que va-t-il se passer? Mes servlets ne pourront pas communiquer avec le conteneur Spring? **
la source
Savez-vous ce qu'est un filtre de servlet et comment il fonctionne? C'est un élément très utile de la spécification de servlet, qui nous permet d'appliquer des concepts de type AOP au service des requêtes HTTP. De nombreux frameworks utilisent des implémentations Filter pour diverses choses, et il n'est pas rare d'en trouver des implémentations personnalisées car elles sont très simples à écrire et utiles. Dans une application Spring, la plupart des choses que votre application peut faire se trouvent dans vos beans Spring. Une instance de filtre, cependant, est contrôlée par le conteneur Servlet. Le conteneur l'instancie, l'initialise et le détruit. Cependant, la spécification de servlet ne nécessite aucun type d'intégration Spring, vous vous retrouvez donc avec un concept vraiment utile (filtres) sans moyen pratique de le lier à votre application Spring et aux beans qui font le travail.
Entrez le DelegatingFilterProxy. Vous écrivez une implémentation de Filter et en faites un bean Spring, mais au lieu d'ajouter votre propre classe Filter au web.xml, vous utilisez DelegatingFilterProxy et lui donnez le nom du bean de votre filtre dans le contexte Spring. (Si vous ne fournissez pas explicitement un nom, il utilise le "nom du filtre".) Ensuite, au moment de l'exécution, DelegatingFilterProxy gère la complexité de trouver la véritable implémentation - celle que vous avez écrite et configurée dans Spring - et d'y acheminer les demandes . Ainsi, au moment de l'exécution, c'est comme si vous aviez répertorié votre filtre dans le fichier web.xml, mais vous bénéficiez de la possibilité de le câbler comme n'importe quel autre Spring bean.
Si vous supprimez ce mappage de filtre de votre web.xml, tout continuera de fonctionner, mais aucune de vos URL ne sera sécurisée. (Cela suppose que le nom «springSecurityFilterChain» décrit précisément ce qu'il fait.) C'est parce que ce mappage filtre chaque requête entrante et la transmet à un filtre de sécurité défini dans votre contexte Spring.
la source
Que sont les filtres de servlet?
Les filtres de servlet sont, en général, un concept Java WebApp. Vous pouvez avoir des filtres de servlet dans n'importe quelle application Web, que vous utilisiez ou non le framework Spring dans votre application.
Ces filtres peuvent intercepter les demandes avant qu'elles n'atteignent le servlet cible. Vous pouvez implémenter des fonctionnalités communes, telles que l'autorisation, dans les filtres de servlet. Une fois implémenté, vous pouvez configurer le filtre dans votre web.xml pour qu'il soit appliqué à un servlet spécifique, à des modèles d'URL de demande spécifiques ou à tous les modèles d'URL.
Où les filtres de servlet sont-ils utilisés?
Les applications Web modernes peuvent avoir des dizaines de tels filtres. Des éléments comme l'autorisation, la mise en cache, la gestion de session ORM et l'injection de dépendances sont souvent implémentés à l'aide d'un filtre de servlet. Tous ces filtres doivent être enregistrés dans
web.xml
.Instanciation des filtres de servlet - sans Spring Framework
Votre conteneur de servlet crée des instances de Filtres déclarés dans
web.xml
et les appelle à des moments appropriés (c'est-à-dire lors du traitement des demandes de servlet). Maintenant, si vous êtes comme la plupart des fans de Dependency Injection (DI), vous diriez probablement que la création d'instances est ce que mon framework DI (Spring) fait mieux. Est-ce que je ne peux pas créer mes filtres de servlet avec Spring pour qu'ils soient compatibles avec toutes les qualités de DI?DelegatingFilterProxy
, afin que Spring crée vos instances de filtreC'est là qu'intervient
DelegatingFilterProxy
.DelegatingFilterProxy
C'est une impélmentation de l'javax.servlet.Filter
interface fournie par Spring Framework. Une fois que vous avez configuréDelegatingFilterProxy
dans web.xml, vous pouvez déclarer les beans réels qui effectuent le filtrage dans votre configuration Spring. De cette façon, Spring crée les instances de beans qui effectuent le filtrage réel, et vous pouvez utiliser DI pour configurer ces beans.Notez que vous n'avez besoin que d'une seule
DelegatingFilterProxy
déclaration dansweb.xml
mais que vous pouvezbean
enchaîner plusieurs filtrages dans le contexte de votre application.la source
Le fait est que les filtres de servlet sont gérés par le conteneur de servlet, et non par ressort. Et vous devrez peut-être injecter des composants de ressort dans vos filtres.
Donc, si vous avez besoin de quelque chose comme:
alors vous avez besoin du proxy de filtrage délégant.
la source
Vous avez raison sur les trucs de «colle». Comme écrit dans JavaDocs de FilterChainProxy :
Veuillez consulter la section FIlterChainProxy du blog Behind the Spring Security Namespace pour une excellente explication.
la source
J'ai été perplexe par "springSecurityFilterChain" dans web.xml et j'ai trouvé cette réponse dans le document de sécurité de springframework:
Voici le lien http://docs.spring.io/spring-security/site/docs/3.0.x/reference/appendix-namespace.html
la source
Cela faisait longtemps mais j'avais la même question et j'ai trouvé ceci: https://www.javacodegeeks.com/2013/11/spring-security-behind-the-scenes.html
J'ai essayé d'exécuter mon projet de sécurité de ressort en supprimant le filtre en question et aussi en l'ajoutant. Ce que j'ai trouvé, c'est que si nous ajoutons le filtre, alors seulement l'appel sera redirigé vers la page de connexion requise telle que définie dans la configuration de spring-security.
Par conséquent, j'accepte la réponse de @ Ryan.
la source