Spring Boot中的全局方法安全性

时间:2014-02-10 10:33:57

标签: spring spring-mvc spring-security spring-boot

尝试在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!";
    }
}

@Secure注释在服务上运行正常,但在控制器中没有运行,所以我在这里阅读(http://docs.spring.io/spring-security/site/faq/faq.html#faq-method-security-in-web-context)我认为是因为方法安全性只在根应用程序上下文中配置而不是在servlet。 但是,我找不到通过Java配置设置此方法的方法,而不是使用web.xml文件。 有什么想法吗?

更新

正如评论中所指出的,方法应该是公开的代理方式。

2 个答案:

答案 0 :(得分:12)

控制器方法需要公开才能代理@Secured。只是这样做应该解决它。

答案 1 :(得分:4)

在XML中,您必须在servlet-context.xml文件中定义第二个global-method-security。这是因为有两个上下文,根上下文和Web上下文以及安全性需要分别配置。

在Java配置中,尝试创建一个单独的Web配置类,并使用@EnableWebMvc标记它:

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