Sécurité Spring ignorant access-denied-handler avec la sécurité au niveau de la méthode
Je suis en utilisant le Printemps 3.2.4 et n'arrive pas à obtenir de Printemps de Sécurité pour rediriger vers mon access-denied-handler
lors de l'utilisation de l'Annotation méthode basée sur le niveau de sécurité. J'ai trouvé plusieurs posts à ce sujet, mais à ce jour, il ne semble pas être une des solutions que j'ai trouvé.
Mon security.xml fichier:
<!-- need this here to be able to secure methods in components other than controllers (as scanned in applicationContext.xml) -->
<global-method-security secured-annotations="enabled" pre-post-annotations="enabled" jsr250-annotations="enabled" ></global-method-security>
<!-- Annotation/JavaConfig examples http://stackoverflow.com/questions/7361513/spring-security-login-page -->
<http use-expressions="true" entry-point-ref="authenticationEntryPoint">
<access-denied-handler ref="accessDeniedHandler"/>
<intercept-url pattern="/secure/login" access="permitAll" />
<intercept-url pattern="/secure/logout" access="permitAll" />
<intercept-url pattern="/secure/denied" access="permitAll" />
<session-management session-fixation-protection="migrateSession" session-authentication-error-url="/login.jsp?authFailed=true">
<concurrency-control max-sessions="10" error-if-maximum-exceeded="true" expired-url="/login.html" session-registry-alias="sessionRegistry"/>
</session-management>
<intercept-url pattern="/**" access="isAuthenticated()" />
<form-login default-target-url="/" authentication-failure-url="/secure/denied" />
<logout logout-url="/secure/logout" logout-success-url="/" />
<expression-handler ref="defaultWebSecurityExpressionHandler" />
</http>
<beans:bean id="authenticationEntryPoint" class="com.ia.security.LoginUrlAuthenticationEntryPoint">
<beans:constructor-arg name="loginFormUrl" value="/secure/login"/>
</beans:bean>
<beans:bean id="accessDeniedHandler" class="com.ia.security.AccessDeniedHandlerImpl">
<beans:property name="errorPage" value="/secure/denied"/>
</beans:bean>
Mon AccessDeniedHandlerImpl.java :
public class AccessDeniedHandlerImpl extends org.springframework.security.web.access.AccessDeniedHandlerImpl {
//SLF4J logger
private static final Logger logger = LoggerFactory.getLogger(AccessDeniedHandlerImpl.class);
@Override
public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {
logger.log("AccessDeniedException triggered!");
super.handle(request, response, accessDeniedException);
}
}
Ma Méthode Annotée:
@PreAuthorize("hasAuthority('ROLE_ZZZZ')")
public ModelAndView getUserInfo( @PathVariable long userId ){
ModelAndView mv = new ModelAndView();
User u = userService.findUser( userId );
mv.addObject("user", u);
return mv;
}
Est-il rien de spécial, j'ai besoin de faire en sorte que mon accès refusé-gestionnaire est appelé?
source d'informationauteur Eric B.
Vous devez vous connecter pour publier un commentaire.
Après plusieurs heures de recherche et de suivi Printemps de code, j'ai enfin découvert ce qui se passait. Je suis d'inscription ici dans le cas où il a de la valeur pour quelqu'un d'autre.
La
access-denied-handler
est utilisé par leExceptionTranslationFilter
dans le cas d'uneAccessDeniedException
. Cependant, laorg.springframework.web.servlet.DispatcherServlet
a été d'essayer d'abord la poignée de l'exception. Plus précisément, j'ai eu unorg.springframework.web.servlet.handler.SimpleMappingExceptionResolver
défini avec undefaultErrorView
. Par conséquent, laSimpleMappingExceptionResolver
était en train de consommer de l'exception d'une redirection vers une vue appropriée, et par conséquent, il n'y a pas d'exception à gauche pour remonter vers l'ExceptionTranslationFilter
.Le correctif a été plutôt simple. Configurer le
SimpleMappingExceptionResolver
ignorer tous lesAccessDeniedException
.Maintenant, chaque fois qu'un
AccessDeniedException
est levée, le résolveur l'ignore et lui permet de bulle en haut de la pile pour lesExceptionTranslationFilter
qui appelle à laaccess-denied-handler
pour gérer l'exception.Je rencontre le même problème. Dans mon cas, il y a déjà un @ControllerAdvise défini qui doit gérer les exceptions - j'ai donc ajouté le AccessDeniedException directement:
Bonne chance avec elle!
L'extension de la Erics réponse avec JavaConfig pour
SimpleMappingExceptionResolver
ignorerAccessDeniedException
de sorte qu'il peut être jeté comme réponse et ne pas être avalé par le SimpleMappingExceptionResolver.