Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring mvc 带球衣和弹簧安全装置的弹簧靴OAuth2_Spring Mvc_Spring Boot_Spring Security_Jersey 2.0_Spring Security Oauth2 - Fatal编程技术网

Spring mvc 带球衣和弹簧安全装置的弹簧靴OAuth2

Spring mvc 带球衣和弹簧安全装置的弹簧靴OAuth2,spring-mvc,spring-boot,spring-security,jersey-2.0,spring-security-oauth2,Spring Mvc,Spring Boot,Spring Security,Jersey 2.0,Spring Security Oauth2,遵循Spring Boot的示例:一切似乎都很好 但是,当我在项目中集成Spring引导安全性OAuth2时,我的OAuth2端点停止工作。日志中有一条警告: 2017-05-04 08:56:24.109警告2827---[nio-8080-exec-1]o.glassfish.jersey.servlet.WebComponent:对URI的servlet请求http://127.0.0.1:8080/oauth/token 在请求正文中包含表单参数,但请求正文已被访问请求参数的servle

遵循Spring Boot的示例:一切似乎都很好

但是,当我在项目中集成Spring引导安全性OAuth2时,我的OAuth2端点停止工作。日志中有一条警告:

2017-05-04 08:56:24.109警告2827---[nio-8080-exec-1]o.glassfish.jersey.servlet.WebComponent:对URI的servlet请求http://127.0.0.1:8080/oauth/token 在请求正文中包含表单参数,但请求正文已被访问请求参数的servlet或servlet筛选器使用。只有使用@FormParam的资源方法才能按预期工作。通过其他方式使用请求正文的资源方法将无法按预期工作。

这让我觉得,即使我没有注册端点,Jersey也在捕获它并处理主体,这使得Spring MVC无法接受请求

我的球衣配置是:

@Component
public class JerseyConfig extends ResourceConfig {

    public JerseyConfig() {
        register(InfoController.class);
    }

}
我的信息控制器非常简单:

@Component
@Path("/me")
@Produces("application/json")
public class InfoController {
  @GET
  public String meAction() {
    return "Hi";
  }
}
最后,我要打的电话,它在日志中引起了警告:

curl-X POST-u客户端应用程序:123456789http://127.0.0.1:8080/oauth/token -H“接受:应用程序/json”-d“密码=aaa&username=aa&grant\u type=password&client\u id=client\u应用程序”

从这个意义上讲,这两个项目(
spring-boot-starter-jersey
spring-security-oauth2
之间是否存在已知的不兼容

删除Jersey配置可以让一切正常,但我需要在控制器上使用它

我对OAuth2的配置是:

@Configuration
public class OAuth2ServerConfiguration {
  @Configuration
  @EnableResourceServer
  protected static class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
    @Override
    public void configure(ResourceServerSecurityConfigurer resources) {
      resources.resourceId("OAuth2 Server");
    }
    @Override
    public void configure(HttpSecurity http) throws Exception {
      // @formatter:off
      http
          .authorizeRequests()
          .antMatchers("/oauth/token").permitAll()
          .antMatchers("/*").authenticated();
      // @formatter:on
    }
  }
}
然后是安全配置本身:

@Configuration
@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

  private final ApiUserDetailsService userDetailsService;

  @Autowired
  public WebSecurityConfiguration(ApiUserDetailsService userDetailsService) {
    this.userDetailsService = userDetailsService;
  }

  @Override
  protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(userDetailsService);
  }

  @Bean
  @Override
  public AuthenticationManager authenticationManagerBean() throws Exception {
    return super.authenticationManagerBean();
  }
}

提前感谢!

Jersey似乎正在尝试处理OAuth端点,但它不应该这样。原因是Jersey的默认映射为
/*
,这意味着它将处理所有URL的请求。您可以通过以下两种方式进行更改:

  • ResourceConfig
    子类的顶部添加一个具有不同映射的
    @ApplicationPath

    @Component
    @ApplicationPath("/api")
    public class JerseyConfig extends ResourceConfig {}
    
  • 您可以在
    应用程序.properties
    文件中添加映射

    spring.jersey.application-path=/api
    

  • 这将为所有Jersey端点添加前缀
    /api
    ,并导致Jersey不处理所有请求,只处理那些以
    /api

    开头的请求,即警告不是特定于使用oauth的。这是Jersey会发生的事情(我认为主要是Tomcat)当您使用
    appliction/x-www-form-urlencoded
    时,它只是告诉您,如果要使用Jersey资源方法中的表单参数,您应该使用
    @FormParam
    (而不是其他方法)。对我来说,如果您收到此警告,那么oauth配置不正确,因为oauth终结点甚至不应该通过Jersey。它应该通过spring security。@peeskillet谢谢。但是我假设如果终结点不通过Jersey(如您在配置中所看到的那样)那么为什么要打印OAuth端点的警告呢?关键是它不应该通过Jersey。Spring Security是一个servlet筛选器,它超出了Jersey应用程序的范围。因此,如果Jersey正在接受对OAuth端点的请求,那么就出了问题。出于某种原因,Spring Security没有处理re我不确定原因是什么。我没有真正使用oauth和spring security。端点是否配置了spring MVC控制器?端点是否只处理spring安全过滤器?如果它们作为spring MVC控制器处理,一个问题是如果您使用的是
    /*
    (默认值)作为Jersey路径配置。这将导致无法访问MVC控制器。天哪,谢谢!我也面临同样的问题,但是关于基本身份验证。对于Spring新手来说,这是一个很难发现的问题。