2009-07-01 5 views
9

J'ai une définition de contexte de sécurité qui utilise PreAuthenticatedProcessingFilterEntryPoint pour la partie flexible de mon application. Comment puis-je avoir une autre définition qui utilisera une connexion de formulaire standard avec des formulaires html pour une autre partie de mon application? Voici ce que j'ai actuellement:Puis-je avoir plusieurs contextes de sécurité avec la sécurité de printemps?

<?xml version="1.0" encoding="UTF-8"?> 
<beans:beans xmlns="http://www.springframework.org/schema/security" 
    xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd 
         http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.1.xsd"> 


    <http auto-config="true" access-denied-page="/admin/access-denied"> 
     <intercept-url pattern="/admin/login*" filters="none"/> 
      <intercept-url pattern="/admin/access-denied" filters="none"/> 
     <intercept-url pattern="/admin/**/*" access="ROLE_ADMIN" /> 
     <form-login login-page="/admin/login" authentication-failure-url="/admin/login?login_error=1" 
      default-target-url="/admin/index" login-processing-url="/admin/login-process"/> 
     <logout logout-success-url="/admin/login"/> 

    </http> 

<global-method-security jsr250-annotations="enabled" /> 

    <beans:bean id="preAuthenticatedEntryPoint" class="org.springframework.security.ui.preauth.PreAuthenticatedProcessingFilterEntryPoint" > 
    </beans:bean> 


    <beans:bean id="userAccountManager" class="com.mycomp.service.managers.jpa.UserAccountJpaManager" /> 
    <beans:bean id="userService" class="com.mycomp.auth.DefaultUserDetailsService" /> 
    <beans:bean id="defaultPasswordEncoder" class="com.mycomp.auth.DefaultPasswordEncoder" /> 

    <authentication-provider user-service-ref="userService"> 
     <password-encoder ref="defaultPasswordEncoder"/> 
    </authentication-provider> 


</beans:beans> 

Ce que je voudrais faire est d'utiliser un autre fournisseur d'authentification pour les urls qui sont dans le site d'administration, celui que j'ai actuellement est pour l'application flexible. Je veux donc que la sécurité des urls admin utilise un autre bean userDetailsService.

+0

J'ai le même problème ... comment cela s'est-il terminé? – HDave

+0

@HDave Je ne suis pas sûr de savoir comment le problème de sécurité de printemps a fini (bien que je l'ai résolu d'une certaine manière voir les réponses ci-dessous), mais à la fin j'ai abandonné l'idée d'une interface d'administration java. fin de la majeure partie du backend de l'application pour le projet est allé de cette façon. – Vasil

Répondre

0

Il s'agit de savoir quelles parties de votre application sont interceptées par la chaîne de filtres Spring Security. Quelque part dans votre configuration xml (en fonction de si vous avez fait la configuration simple balise ou non) il y a une interception regex comme ceci:

<intercept-url pattern="/**" ...> 

Vous pouvez avoir différents modèles d'interception qui utilisent différentes configurations (parties aka différentes la chaîne de filtrage de sécurité). Je pourrais vous donner une réponse plus concrète si vous postez votre xml de configuration actuelle.

EDIT: Actuellement, vous utilisez la balise http pour définir votre configuration Spring Security. Cette balise est utilisée comme raccourci/assistant et elle définit automatiquement un grand nombre de parties de la chaîne de filtres de sécurité qui peuvent également être configurées manuellement. Je pense que votre cas d'utilisation ne correspond pas au paradigme de configuration automatique, vous devrez donc configurer manuellement la chaîne de filtres pour les différents modèles d'URL (comme indiqué dans le post ci-dessous le mien). Vous pouvez créer votre propre PreAuthenticationFilter (qui prendra un UserDetailsService personnalisé) et l'ajouter le cas échéant au mappage d'interception de la chaîne de filtres.

+0

J'ai posté ma configuration de contexte de sécurité. J'apprécierais que vous puissiez m'aider avec ça. – Vasil

2

Carte chaque chaîne de filtre à un modèle d'URL diferent:

<bean id="myfilterChainProxy" 
    class="org.springframework.security.util.FilterChainProxy"> 
    <security:filter-chain-map pathType="ant"> 
    <security:filter-chain pattern="/flex" filters="filterF"/> 
    <security:filter-chain pattern="/**" filters="filter1,filter2,filter3"/> 
    </security:filter-chain-map> 
</bean> 
+0

Je suppose que c'est ce que je dois faire. Cependant, je ne sais pas quel est le moyen le plus simple de définir un filtre avec seulement un fournisseur d'authentification personnalisé. – Vasil

12

Il a été difficile à faire jusqu'à récemment, mais maintenant il est facile!

Spring Security a ajouté la prise en charge du scénario dans la version 3.1. Il est actuellement disponible en tant que Release Candidate, implémenté par SEC-1171. Les détails de la syntaxe sont dans le manuel inclus avec 3.1.

C'est assez simple à utiliser. Vous devez simplement définir plusieurs éléments http dans votre configuration Spring Security, un pour chaque contexte. Nous l'utilisons comme ceci:

<!-- Configure realm for system administration users --> 
<security:http pattern="/admin/**" create-session="stateless"> 
    <security:intercept-url pattern='/**' access='ROLE_ADMIN' requires-channel="https" /> 
    <security:custom-filter position="PRE_AUTH_FILTER" ref="preAuthFilter" /> 
</security:http> 


<!-- Configure realm for standard users --> 
<security:http auto-config="true" access-denied-page="/error/noaccess" use-expressions="true" create-session="ifRequired"> 
    <security:form-login 
      ... 
      ... 
</security:http> 

L'essentiel à noter est le pattern="/admin/**" sur le premier élément http. Cela indique à Spring que toutes les URL sous /admin sont soumises à ce contexte au lieu du contexte par défaut - et donc les URL sous /admin utilisent plutôt votre filtre de pré-autorisation.

+0

Bonjour, j'ai le même problème en utilisant plusieurs éléments 'http'.Je l'ai mappé avec des modèles différents et j'ai toujours partagé 'SecurityContext' entre les domaines de sécurité (éléments' http'). –

Questions connexes