2014-02-10 14 views
10

Ich habe einige Probleme, wenn ich versuche, die globale Methodensicherheit in einer Spring Boot-Anwendung zu aktivieren. Mehr oder weniger Ich habe diese Konfiguration:Globale Methodensicherheit im Spring Boot

@ComponentScan 
@Configuration 
@EnableAutoConfiguration 
@EnableConfigurationProperties 
public class Main extends SpringBootServletInitializer { 

    public static void main(String[] args) throws Exception { 
     SpringApplication app = new SpringApplication(Main.class); 
     app.setShowBanner(false); 
     ApplicationContext context = app.run(args); 
    } 

    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
     return application.sources(Main.class); 
    } 
} 

@Configuration 
@EnableWebSecurity 
@EnableGlobalMethodSecurity(securedEnabled = true, proxyTargetClass = true) 
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { 

    @Bean 
    @Override 
    public AuthenticationManager authenticationManagerBean() throws Exception { 
     return super.authenticationManagerBean(); 
    } 

    @Override 
    protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
     ... 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     ... 
    } 
} 

@Controller 
public class SampleController { 

    @RequestMapping("/api/hello") 
    @ResponseBody 
    String hello() { 
     return "Hello!"; 
    } 

    @Secured(SecurityGrant.WRITE_PROJECT) 
    @RequestMapping("/api/bye") 
    @ResponseBody 
    String bye() { 
     return "Bye!"; 
    } 
} 

Die @Secure Anmerkungen arbeiten an Dienstleistungen in Ordnung, aber nicht in Controller, so wie ich hier gelesen (http://docs.spring.io/spring-security/site/faq/faq.html#faq-method-security-in-web-context) Ich denke, da Methode Sicherheit nur in so konfiguriert ist, der Stammanwendungskontext und nicht in dem für das Servlet. Allerdings kann ich dies nicht über die Java-Konfiguration festlegen, anstatt eine web.xml-Datei zu verwenden. Irgendwelche Ideen?

Update:

Wie in den Kommentaren darauf sollten Methoden öffentlich proxied werden.

+1

Müssen die Controller-Methoden nicht öffentlich sein, damit sie für '@ Secured' verwendet werden können? –

+0

Das ist es! Du hast meinen Tag gerettet. –

Antwort

11

Die Controller-Methoden sein, um der Öffentlichkeit müssen für @Secured proxied zu werden. Just doing das sollte es beheben.

+0

Und wie um nicht autorisierte Seite auf "Zugriff verweigert" -Seite umleiten? – Max

+0

Ich glaube nicht, dass das für diese Frage relevant ist, oder? –

4

In XML müssten Sie eine zweite global-method-security in der Datei servlet-context.xml definieren. Dies liegt daran, dass zwei Kontexte vorhanden sind: Der Stammkontext und der Webkontext und die Sicherheit müssen in jedem separat konfiguriert werden.

In Java Config, versuchen Sie eine separate Web-Konfigurationsklasse zu erstellen, und markieren Sie es mit @EnableWebMvc:

@Configuration 
@EnableWebMvc 
@EnableGlobalMethodSecurity(securedEnabled = true, proxyTargetClass = true) 
public class WebConfig { 
    ... 
} 
+0

Spring Boot '@ EnableAutoConfiguration' macht das schon, also glaube ich nicht, dass das das Problem ist. –

+0

Und was macht diese Klasse hier proxyTargetClass = true? – Max

Verwandte Themen