2012-11-08 4 views
2

Je voudrais savoir comment je peux gérer (par exemple attraper, log et rediriger le flux) AccessDeniedException qui vient de «l'annotation de sécurité» (@PreAuthorize, @Secured, etc ...)?JSF 2 + Spring Security 3.1.x @Secured AccessDeniedException de gestion

J'ai essayé de mettre ma propre AccessDeniedHandler:

<http auto-config="true" use-expressions="true"> 
    ... 
    <access-denied-handler ref="myAccessDeniedHandler" /> 
</http> 

mais il semble que interceptant seules exceptions qui sont soulevées lorsque je tente de se rendre à des ressources non autorisées.

Mais exception qui vient de

@PreAuthorize("hasRole('ROLE_ADMIN')") 
public void myMethod(){ 
    System.out.println("Secret Method"); 
} 

ne sont pas traités de cette façon.

+0

Êtes-vous sûr de bien avoir configuré la protection de votre méthode? Je veux dire ''? Êtes-vous sûr que AccessDeniedException est lancé? –

+0

oui, je l'ai configuré et oui, "AccessDeniedException: accès refusé" est levée – user1809425

+0

Afficher toute votre configuration de sécurité de printemps –

Répondre

0

Voici ma config complète de sécurité du printemps

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

    <http auto-config="true" use-expressions="true"> 
     <intercept-url pattern="/pages/secure/**" access="hasRole('ROLE_USER')" /> 
     <intercept-url pattern="/pages/admin/**" access="hasRole('ROLE_ADMIN')" /> 
     <intercept-url pattern="/pages/unsecure/**" access="permitAll" /> 
     <intercept-url pattern="/**" access="permitAll" /> 
     <form-login login-page="/login.jsf " 
      authentication-failure-url="/loginfailed.jsf" /> 
     <logout logout-success-url="/default.jsf" /> 
     <access-denied-handler ref="myAccessDeniedHandler" /> 
    </http> 

    <authentication-manager> 
     <authentication-provider> 
      <jdbc-user-service data-source-ref="postgresDataSource" 
       users-by-username-query=" 
       select username,password, enabled 
       from users where username=?" 

       authorities-by-username-query=" 
       select u.username, ur.authority from users u, role ur 
       where u.user_id = ur.user_id and u.username =? " /> 
     </authentication-provider> 
    </authentication-manager> 

    <!-- business logic (method) security --> 
    <global-method-security secured-annotations="enabled" 
     jsr250-annotations="enabled" 
     pre-post-annotations="enabled"/> 
</beans:beans> 
+0

Vos méthodes protégées sont-elles appelées dans le cadre d'une requête http? –

0

Ce poste est un peu vieux, donc je suppose que vous n'avez pas besoin d'une réponse plus. Toujours répondre à cette question pour les autres:

Premier: Vous avez raison: <access-denied-handler ref="myAccessDeniedHandler" /> ne gère que les demandes de ressources, vous avez donc besoin de quelque chose de différent pour gérer AccessDeniedExceptions levé par votre propre code ou par Spring-Security en raison de @PreAuthorize.

Qu'est-ce que vous pouvez faire est d'utiliser pour écrire un aspect autour de-Printemps-AOP/AspectJ avec une référence pointcut toutes les méthodes qui sont annotés avec une annotation spécifique (dans votre cas @PreAuthorize)

voir JSF2 with SpringSecurity: handle AccessDeniedException of @Secured-Annotation pour un exemple de gestion @Secured -annotations

Questions connexes