我尝试使用jersey和spring security创建一个SpringBoot应用程序。 我想使用基本身份验证来保护我的整个应用程序。 我的安全配置:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(jsr250Enabled = true, securedEnabled = true, prePostEnabled = true)
public class WebSerucityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().authenticated().and().httpBasic();
@Override
public void configure(WebSecurity web) throws Exception {
web.debug(true);
}
@Autowired(required = false)
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication()
.withUser("user").password("password").roles("USER").and()
.withUser("admin").password("password").roles("USER", "ADMIN");
}
}
我的泽西控制器:
@Component
@Path("/")
public class Home {
@GET
@Produces("application/json")
public String list() {
String email = (String) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
return email;
}
}
没有Spring安全性(如果我允许所有请求)应用程序控制器运行,但如果我启用httpBasic身份验证,我总是得到http 404。
有什么想法吗?
答案 0 :(得分:4)
这是因为Jersey和Spring MVC映射到同一个地方 - 根目录" /"。
检查你的日志:Spring的Dispatcher Servlet在Jersey Servlet之后注册(在你的日志中检查ServletRegistrationBean
短语)。
情景是:
这就是为什么你总是这个404。
最简单的解决方案是在application.properties
中添加属性server.servlet-path=/some_context_for_spring_mvc
这使泽西岛将被映射到root" /"但是Spring MVC到some_context_for_spring_mvc
- 现在Jersey和Spring MVC之间的冲突消失了。
有关Spring Boot中Spring MVC的更多详细信息,请访问:
Spring Boot希望提供来自应用程序根目录的所有内容。如果您希望将自己的servlet映射到该URL,则可以执行此操作,但当然您可能会丢失其他一些Boot MVC功能。要添加自己的servlet并将其映射到根资源,只需声明一个Servlet类型的@Bean,并为其指定特殊的bean名称dispatcherServlet(如果要关闭它,还可以创建具有该名称的不同类型的bean)不要替换它。)
我希望这会有所帮助。