尝试在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文件进行设置的方法。有任何想法吗?
更新:
正如评论中指出的那样,应该公开使用方法。
控制器方法需要公开才能被代理使用@Secured。只是这样做应该解决它。
@Secured