Spring 4安全配置运行但未激活

时间:2016-09-27 08:01:29

标签: java spring spring-security spring-4

我对Spring很新,很抱歉,如果我的问题听起来很愚蠢。

我正在尝试将基本的HTTP Auth添加到基于Spring的REST API中。

我现在一直在关注quite a few tutorialsreference文件,但它们似乎都表明了同样的事情,因此很明显我必须遗漏一些东西。

我想要的是定义一个简单的配置,其中默认情况下每个请求都在HTTP Auth之后,但是我们可以使用@PreAuthorize根据需要定义方法级安全性,或者修改{{1}配置

我已经定义了一个非常简单的配置:

HttpSecurity

然后我有一个非常简单的控制器(没有服务,没有什么花哨的)。

这是一个非常基本的概述:

@Configuration
@EnableWebMvc
@EnableWebSecurity
@ComponentScan(basePackages = "com.app.rest")
public class RESTConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .anyRequest().hasAnyRole("USER")
                .and()
                .httpBasic();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("user").password("password").roles("USER");
    }
}

与所有在线教程相比,唯一明显的区别是我们加载此API的方式。因为我们已经有一个运行其他东西的Jetty容器,所以我们决定重用它,而不是像大多数人一样在线使用@RestController @RequestMapping("/images") public class ImagesController { @JsonView(View.Basic.class) @RequestMapping(value = "/{id}", method = RequestMethod.GET) public ObjectXvo getImageByID(@PathVariable String id) throws IOException { ObjectXvo result = doThings(); return result; } }

以下是REST API定义方式的摘录:

WebAppInitializer

问题是,在运行应用程序时,我仍然可以访问所有URL,就像我没有设置任何安全方案一样。 在调试应用程序时,我可以看到正在处理// Creating REST Servlet ServletContextHandler restHandler = new ServletContextHandler(ServletContextHandler.SESSIONS); restHandler.setErrorHandler(null); restHandler.setContextPath("/rest"); AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); context.setConfigLocation("com.app.test"); WebApplicationContext webAppContext = context; DispatcherServlet dispatcherServlet = new DispatcherServlet(webAppContext); ServletHolder springServletHolder = new ServletHolder("REST dispatcher", dispatcherServlet); restHandler.addServlet(springServletHolder, "/"); restHandler.addEventListener(new ContextLoaderListener(webAppContext)); // Creating handler collection ContextHandlerCollection handlerCollection = new ContextHandlerCollection(); handlerCollection.addHandler(anotherHandler); handlerCollection.addHandler(restHandler); handlerCollection.addHandler(yetAnotherHandler); // Setting server context server.setHandler(handlerCollection); ,因为我的配置方法中的断点肯定会受到攻击。

我们已尽力避免使用XML文件,因为我们认为注释目前更好。

有人能指出我为什么没有激活此安全配置的正确方向?

编辑:

不确定它有多相关,但如果我尝试向REST方法添加RESTConfiguration,我会收到以下错误:

@PreAuthorize

互联网上有很多关于如何解决此问题的信息,但我想知道这是否与此无关。

1 个答案:

答案 0 :(得分:1)

您必须注册springSecurityFilterChain,请参阅Spring Security Reference

  

下一步是在战争中注册springSecurityFilterChain。这可以在Java配置中使用Spring的WebApplicationInitializer支持在Servlet 3.0+环境中完成。不出所料,Spring Security提供了一个基类AbstractSecurityWebApplicationInitializer,它将确保为您注册springSecurityFilterChain。我们使用AbstractSecurityWebApplicationInitializer的方式取决于我们是否已经使用Spring,或者Spring Security是否是我们应用程序中唯一的Spring组件。

如果您不使用AbstractSecurityWebApplicationInitializer,则必须手动注册springSecurityFilterChain

webAppContext.getServletContext()
    .addFilter("springSecurityFilterChain", new DelegatingFilterProxy("springSecurityFilterChain"))
    .addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST, DispatcherType.ERROR, DispatcherType.ASYNC), false, "/*");

另见: