2010-11-24 3 views
32

J'utilise Spring Security 3.0.4. J'ai un tas de service Web qui sont protégés par Spring Security. Lorsque je les accède en tant qu'utilisateur non authentifié, Spring Security redirige vers la page de connexion. Au lieu de cela, je veux retourner l'erreur HTTP 403. Comment puis-je y parvenir?Sécurité de printemps - besoin d'erreur 403, pas de redirection

Voici ma config de sécurité:

<http auto-config="false" use-expressions="true" > 

    <intercept-url pattern="/authorization.jsp" access="permitAll"/> 
    <intercept-url pattern="/registration.jsp" access="permitAll"/> 
    <intercept-url pattern="/api/authorization/auth" access="permitAll"/> 
    <intercept-url pattern="/api/authorization/new" access="permitAll"/> 
    <intercept-url pattern="/api/accounts/new" access="permitAll"/> 
    <intercept-url pattern="/app/**" access="permitAll"/> 
    <intercept-url pattern="/extjs/**" access="permitAll"/> 

    <intercept-url pattern="/**" access="hasRole('ROLE_USER')" /> 

    <form-login login-page="/authorization.jsp" 
      default-target-url="/index.jsp" 
      authentication-failure-url="/registration.jsp?login_error=1" 
      always-use-default-target="true" 
      /> 

    <logout logout-success-url="/authorization.jsp" 
      logout-url="/j_spring_security_logout" 
      invalidate-session="true"/>   

</http> 
+0

Avez-vous essayé de supprimer le paramètre "authentication-failure-url" de votre formulaire de connexion? – Gandalf

+0

Avez-vous trouvé une solution de travail? J'ai entendu dire que le moyen d'y parvenir est de remplacer "certains filtres de Spring", mais sans exemple, et je pense qu'il devrait être possible de configurer, par exemple. Application AJAX aime faire la journalisation personnalisée sur le canal JSON et les canaux JSON pour les données sont censés réagir avec 403 sur aucun droit de service. –

+0

Connexes: http://stackoverflow.com/questions/3339431/how-to-handle-expired-session-using-spring-security-and-jquery – usethe4ce

Répondre

-4

Il doit renvoyer une erreur 403 à moins que vous le configurer pour aller vers une autre URL avec ce tag:

<sec:access-denied-handler error-page="/urlToGoIfForbidden" /> 
+2

Oui, le demandeur sait qu'il devrait le faire, car il a posé cette question. Et il a demandé parce que non. –

+1

Cette étiquette ne fonctionne que pour les utilisateurs AUTHENITCATED avec pas assez de PREVILAGES (ce qui se trouve dans les docs ..) – Mat

8

Il y a un article sur les forums de printemps here qui décrit comment obtenir votre application de déterminer entre les deux méthodes. Jusqu'à présent, je suis en utilisant le code suivant pour sécuriser mes contrôleurs de données:

<bean id="ep403" class="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint"/> 

<sec:http pattern="/data/**" entry-point-ref="ep403" use-expressions="true"> 
    <sec:intercept-url pattern="/**" access="isAuthenticated()"/> 
</sec:http> 

<bean id="epauth" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint"> 
    <constructor-arg value="/login.html"/> 
</bean> 

<sec:http pattern="/**" entry-point-ref="epauth" use-expressions="true"> 
    <sec:intercept-url pattern="/**" access="isAuthenticated()"/> 
</sec:http> 

donc toute solution DelegatingAuthenticationEntryPoint dans l'article I Liées est un peu plus lourd, mais je pense qu'il fait le travail très bien aussi.

+0

La solution dans l'article que vous avez posté a résolu ce problème pour moi. Merci! –

8

(vieille question, mais vaut la peine de répondre.)

Fondamentalement, vous devez

  • Créer une RequestMatcher pour déterminer qui demande devrait obtenir un 403 (AntPathRequestMatcher peut suffire dans votre cas).
  • Configurez le HttpSessionRequestCache pour vérifier le comparateur et ne pas stocker ces pages pour la redirection post-connexion.
  • Utilisez un DelegatingAuthenticationEntryPoint soit 403 la demande pure et simple ou rediriger pour se connecter en fonction du comparateur.

Voir l'exemple ici:

http://distigme.wordpress.com/2012/11/01/ajax-and-spring-security-form-based-login/

10

Pour la configuration java que vous devez faire

http.exceptionHandling().authenticationEntryPoint(alwaysSendUnauthorized401AuthenticationEntryPoint); 

Où alwaysSendUnauthorized401AuthenticationEntryPoint est innstance de classe

public class AlwaysSendUnauthorized401AuthenticationEntryPoint implements AuthenticationEntryPoint { 
    @Override 
    public final void commence(HttpServletRequest request, HttpServletResponse response, 
           AuthenticationException authException) throws IOException { 
     LOGGER.debug("Pre-authenticated entry point called. Rejecting access"); 
     response.sendError(HttpServletResponse.SC_UNAUTHORIZED); 
    } 
} 

Ceci désactive le comportement par défaut de Spring (redirection des requêtes non authentifiées vers le formulaire de connexion).

Side note: pour un tel cas, le code HTTP SC_UNAUTHORIZED (401) est meilleur choix que SC_FORBIDDEN (403).

Questions connexes