我对Spring很新,很抱歉,如果我的问题听起来很愚蠢。
我正在尝试将基本的HTTP Auth添加到基于Spring的REST API中。
我现在一直在关注quite a few tutorials和reference文件,但它们似乎都表明了同样的事情,因此很明显我必须遗漏一些东西。
我想要的是定义一个简单的配置,其中默认情况下每个请求都在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
互联网上有很多关于如何解决此问题的信息,但我想知道这是否与此无关。
答案 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, "/*");
另见: