2015-05-20 4 views
5

Ich habe eine Webanwendung konfiguriert, Spring Security 3.2 standardmäßig zu verwenden.Spring Security: Verweigern Sie den Zugriff auf Controller-Methoden, wenn @PreAuthorize Annotation fehlt

Ich verwende die @PreAuthorize Annotation, um die Controller-Methode zu sichern. Nun möchte ich den Zugriff auf jede Controller-Methode UNLESS es ist mit @PreAuthorize annotiert.

Ich habe folgende Ansätze versucht:

Super Controller

Jeder Controller von einem Super-Controller erweitert kommentierte mit: @PreAutorize("denyAll"). Dieser Ansatz scheint nicht zu funktionieren, da die Methoden-Annotationen der Controller ignoriert werden. Alles ist verboten.

@PreAutorize("denyAll") 
public class SuperController { 

} 

public class MyController extends SuperController { 

    @PreAuthorize("hasRole('SUPERHERO')") 
    @RequestMapping(value = URL_PREFIX + "Add.do", method = RequestMethod.GET) 
    public String doStuff(Model model) { 

     ... 
    } 

} 

aop

einen pointcut Ausdruck in dem globalen Methode Sicherheitsetikett

<global-method-security pre-post-annotations="enabled"> 
    <protect-pointcut expression="execution(* com.acme.*Controller.*(..))" access="denyAll" /> 
</global-method-security> 

Dieser Ansatz scheitert auch: Methoden des Controller, die nicht mit Anmerkungen versehen ist, sind noch verfügbar.

Antwort

1

Ich beantworte meine eigene Frage hier.

Ich habe das Problem mit einem HandlerInterceptorAdapter gelöst.

Ich bin mir nicht sicher, es ist der Frühling-idiomatische Weg, um das Ergebnis zu erreichen, aber es ist gut genug für mich.

public class MvcPreAuthorizeAnnotationCheckerInterceptor extends HandlerInterceptorAdapter { 
    final HandlerMethod hm; 
    if (handler instanceof HandlerMethod) { 
     hm = (HandlerMethod) handler; 
     PreAuthorize annotation = hm.getMethodAnnotation(PreAuthorize.class); 
     if (annotation == null) { 
      // check if the class is annotated... 
      annotation = hm.getMethod().getDeclaringClass().getAnnotation(PreAuthorize.class); 
      if (annotation == null) { 
       // add logging 
       // or send a NON AUTHORIZED 
       response.sendRedirect(request.getContextPath()); 
      } 
     } 
     return true; 
    } 
} 

Und im Frühjahr config:

<mvc:interceptors> 
    <beans:ref bean="mvcPreAuthorizeAnnotationCheckerInterceptor"/> 
</mvc:interceptors> 

<beans:bean id="mvcPreAuthorizeAnnotationCheckerInterceptor" class="com.acme.MvcPreAuthorizeAnnotationCheckerInterceptor"/> 
Verwandte Themen