2010-05-20 5 views
0

J'ai configuré mon application Web avec le fichier de configuration suivante:Configuration Spring Security mène à Perpetual Demande d'authentification

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:security="http://www.springframework.org/schema/security" 
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.xsd 
    http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd"> 

<security:global-method-security secured-annotations="enabled" pre-post-annotations="enabled" /> 

<!-- 
    Filter chain; this is referred to from the web.xml file. Each filter 
    is defined and configured as a bean later on. 
--> 
<!-- Note: anonumousProcessingFilter removed. --> 
<bean id="filterChainProxy" class="org.springframework.security.web.FilterChainProxy"> 
    <security:filter-chain-map path-type="ant"> 
     <security:filter-chain pattern="/**" 
      filters="securityContextPersistenceFilter, 
       basicAuthenticationFilter, 
       exceptionTranslationFilter, 
       filterSecurityInterceptor" /> 
    </security:filter-chain-map> 
</bean> 

<!-- 
    This filter is responsible for session management, or rather the lack 
    thereof. 
--> 
<bean id="securityContextPersistenceFilter" class="org.springframework.security.web.context.SecurityContextPersistenceFilter"> 
    <property name="securityContextRepository"> 
     <bean class="org.springframework.security.web.context.HttpSessionSecurityContextRepository"> 
      <property name="allowSessionCreation" value="false" /> 
     </bean> 
    </property> 
</bean> 

<!-- Basic authentication filter. --> 
<bean id="basicAuthenticationFilter" class="org.springframework.security.web.authentication.www.BasicAuthenticationFilter"> 
    <property name="authenticationManager" ref="authenticationManager" /> 
    <property name="authenticationEntryPoint" ref="authenticationEntryPoint" /> 
</bean> 

<!-- Basic authentication entry point. --> 
<bean id="authenticationEntryPoint" class="org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint"> 
    <property name="realmName" value="Ayudo Web Service" /> 
</bean> 

<!-- 
    An anonymous authentication filter, which is chained after the normal authentication mechanisms and automatically adds an 
    AnonymousAuthenticationToken to the SecurityContextHolder if there is no existing Authentication held there. 
--> 
<!-- 
    <bean id="anonymousProcessingFilter" class="org.springframework.security.web.authentication.AnonymousProcessingFilter"> 
    <property name="key" value="ayudo" /> <property name="userAttribute" value="anonymousUser, ROLE_ANONYMOUS" /> </bean> 
--> 

<!-- 
    Authentication manager that chains our main authentication provider 
    and anonymous authentication provider. 
--> 
<bean id="authenticationManager" class="org.springframework.security.authentication.ProviderManager"> 
    <property name="providers"> 
     <list> 
      <ref local="daoAuthenticationProvider" /> 
      <ref local="inMemoryAuthenticationProvider" /> 
      <!-- <ref local="anonymousAuthenticationProvider" /> --> 
     </list> 
    </property> 
</bean> 

<!-- 
    Main authentication provider; in this case, memory implementation. 
--> 
<bean id="inMemoryAuthenticationProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider"> 
    <property name="userDetailsService" ref="propertiesUserDetails" /> 
</bean> 

<security:user-service id="propertiesUserDetails" properties="classpath:operators.properties" /> 

<!-- Main authentication provider. --> 
<bean id="daoAuthenticationProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider"> 
    <property name="userDetailsService" ref="userDetailsService" /> 
</bean> 

<!-- 
    An anonymous authentication provider which is chained into the ProviderManager so that AnonymousAuthenticationTokens are 
    accepted. 
--> 
<!-- 
    <bean id="anonymousAuthenticationProvider" class="org.springframework.security.authentication.AnonymousAuthenticationProvider"> 
    <property name="key" value="ayudo" /> </bean> 
--> 

<bean id="userDetailsService" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl"> 
    <property name="dataSource" ref="dataSource" /> 
</bean> 

<bean id="exceptionTranslationFilter" class="org.springframework.security.web.access.ExceptionTranslationFilter"> 
    <property name="authenticationEntryPoint" ref="authenticationEntryPoint" /> 
    <property name="accessDeniedHandler"> 
     <bean class="org.springframework.security.web.access.AccessDeniedHandlerImpl" /> 
    </property> 
</bean> 

<bean id="filterSecurityInterceptor" class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor"> 
    <property name="securityMetadataSource"> 
     <security:filter-security-metadata-source use-expressions="true"> 
      <security:intercept-url pattern="/*.html" access="permitAll" /> 
      <security:intercept-url pattern="/version" access="permitAll" /> 
      <security:intercept-url pattern="https://stackoverflow.com/users/activate" access="permitAll" /> 
      <security:intercept-url pattern="/**" access="isAuthenticated()" /> 
     </security:filter-security-metadata-source> 
    </property> 
    <property name="authenticationManager" ref="authenticationManager" /> 
    <property name="accessDecisionManager" ref="accessDecisionManager" /> 
</bean> 

<bean id="accessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased"> 
    <property name="decisionVoters"> 
     <list> 
      <bean class="org.springframework.security.access.vote.RoleVoter" /> 
      <bean class="org.springframework.security.web.access.expression.WebExpressionVoter" /> 
     </list> 
    </property> 
</bean> 

Dès que je lance mon application sur tomcat, je reçois une demande de nom d'utilisateur/mot de passe d'authentification de base. Même lorsque j'essaie d'accéder à: localhost: 8080/myapp/version, explicitement défini sur allowAll, j'obtiens la boîte de dialogue de demande d'authentification. Aidez-moi!

Remerciez, Sammy

Répondre

1

Vous avez la basicAuthenticationFilter dans votre chaîne de filtre à cet effet, il va essayer d'authentifier un utilisateur. Le permitAll permettra à n'importe quel utilisateur, mais la demande doit toujours avoir un utilisateur dans le SecurityContext (récupéré à partir de votre UserDetailsService).

Si vous voulez que ces URI pour permettre à tous l'accès (même sans authentification d'un utilisateur), puis faire ceci:

<intercept-url pattern="/version" filters="none"/> 
+0

Je comprends, je vous remercie. Eh bien dans ce cas, ce qui est mieux: de remettre le filtre d'authentification anonyme, ou de modifier le modèle de fourmis de la chaîne de filtre pour exclure ces URLs? Donc, si je comprends bien, le permisAll est simplement à des fins d'autorisation. Ai-je raison de mettre les balises @secure sur mes méthodes de couche de service et c'est tout? – Sammy

+0

Ajouté plus à ma réponse - Je pense que c'est ce que vous cherchez. – Gandalf

+1

En fait, j'ai essayé cela ... J'ai: Problème de configuration: L'attribut 'filters' n'est pas autorisé ici. – Sammy