Spring 使用 Jersey 基本身份验证启动总是 404
Spring Boot with Jersey basic authentication always 404
我尝试使用球衣和 spring 安全性创建 Spring 启动应用程序。
我想使用基本身份验证来保护我的整个应用程序。
我的安全配置:
@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。
有什么想法吗?
这是因为 Jersey 和 Spring MVC 正在映射到同一个地方 - 到根上下文“/”。
检查您的日志:Spring 的 Dispatcher Servlet 在 Jersey Servlet 之后注册(检查您日志中的 ServletRegistrationBean
短语)。
场景是:
- 例如,您使用 curl 发送了请求
- Jersey 尝试处理您的请求,但出现 HTTP 错误 401 未授权
- 现在 Spring MVC 已尝试处理您的请求
- 但是您还没有在 Spring MVC 中配置这个特定的上下文,所以出现了 Http Error 404 Not found
这就是为什么你总是有这个 404。
最简单的解决方案是在 application.properties
中添加 属性
server.servlet-path=/some_context_for_spring_mvc
这使得 Jersey 将映射到根“/”,但 Spring MVC 映射到 some_context_for_spring_mvc
- 现在 Jersey 和 Spring MVC 之间的冲突消失了。
更多关于 Spring MVC in Spring Boot 的详细信息你可以在这里找到:
Spring Boot wants to serve all content from the root of your application / down. If you would rather map your own servlet to that URL you can do it, but of course you may lose some of the other Boot MVC features. To add your own servlet and map it to the root resource just declare a @Bean of type Servlet and give it the special bean name dispatcherServlet (You can also create a bean of a different type with that name if you want to switch it off and not replace it).
希望对您有所帮助。
我尝试使用球衣和 spring 安全性创建 Spring 启动应用程序。 我想使用基本身份验证来保护我的整个应用程序。 我的安全配置:
@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。
有什么想法吗?
这是因为 Jersey 和 Spring MVC 正在映射到同一个地方 - 到根上下文“/”。
检查您的日志:Spring 的 Dispatcher Servlet 在 Jersey Servlet 之后注册(检查您日志中的 ServletRegistrationBean
短语)。
场景是:
- 例如,您使用 curl 发送了请求
- Jersey 尝试处理您的请求,但出现 HTTP 错误 401 未授权
- 现在 Spring MVC 已尝试处理您的请求
- 但是您还没有在 Spring MVC 中配置这个特定的上下文,所以出现了 Http Error 404 Not found
这就是为什么你总是有这个 404。
最简单的解决方案是在 application.properties
中添加 属性server.servlet-path=/some_context_for_spring_mvc
这使得 Jersey 将映射到根“/”,但 Spring MVC 映射到 some_context_for_spring_mvc
- 现在 Jersey 和 Spring MVC 之间的冲突消失了。
更多关于 Spring MVC in Spring Boot 的详细信息你可以在这里找到:
Spring Boot wants to serve all content from the root of your application / down. If you would rather map your own servlet to that URL you can do it, but of course you may lose some of the other Boot MVC features. To add your own servlet and map it to the root resource just declare a @Bean of type Servlet and give it the special bean name dispatcherServlet (You can also create a bean of a different type with that name if you want to switch it off and not replace it).
希望对您有所帮助。