【问题标题】:CORS on Spring-OAuth2Spring-OAuth2 上的 CORS
【发布时间】:2016-03-25 01:21:09
【问题描述】:

我正在使用 Spring-Boot 和 Spring-OAuth2 来保护我的 Rest API。我已经实现了 OAuth2。它得到正确执行。我开发了 AngularJS 并尝试访问它,但出现 CORS 错误。

错误 -> Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://192.168.2.45:8080/Jaihind/oauth/token. (Reason: CORS header 'Access-Control-Allow-Origin' missing).

网址 -> curl -X POST -vu clientapp:123456 http://localhost:8080/Jaihind/oauth/token -H "Accept: application/json" -d "password=password&username=gaurav&grant_type=password&scope=read%20write&client_secret=123456&client_id=clientapp"

下面是代码。

OAuth2ServerConfiguration.java

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class OAuth2ServerConfiguration {

    private static final String RESOURCE_ID = "restservice";

    @Configuration
    @EnableResourceServer

    protected static class ResourceServerConfiguration extends
            ResourceServerConfigurerAdapter {

        @Override
        public void configure(ResourceServerSecurityConfigurer resources) {
            // @formatter:off
            resources.resourceId(RESOURCE_ID);
            // @formatter:on
        }

        @Override
        public void configure(HttpSecurity http) throws Exception {

            // @formatter:off
            http.authorizeRequests().antMatchers("/api/greeting").authenticated();
            http.authorizeRequests().antMatchers("/oauth/token").permitAll();
            //http.antMatcher("/oauth/token").p

            // @formatter:on
        }

    }

    @Configuration
    @EnableAuthorizationServer
    protected static class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {

        private TokenStore tokenStore = new InMemoryTokenStore();

        @Autowired
        @Qualifier("authenticationManagerBean")
        private AuthenticationManager authenticationManager;

        @Autowired
        private UserDetailServiceBean userDetailsService;

        @Override
        public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
            // @formatter:off

            endpoints.addInterceptor(new HandlerInterceptorAdapter() {
                @Override
                public boolean preHandle(HttpServletRequest hsr, HttpServletResponse rs, Object o) throws Exception {
                    rs.setHeader("Access-Control-Allow-Origin", "*");
                    rs.setHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS");
                    rs.setHeader("Access-Control-Allow-Headers", "Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,Authorization");
                    return true;
                }
            });
            endpoints.tokenStore(this.tokenStore)
                    .authenticationManager(this.authenticationManager)
                    .userDetailsService(userDetailsService);
            // @formatter:on
        }

        @Override
        public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
            // @formatter:off
            clients
                    .inMemory()
                    .withClient("clientapp")
                    .authorizedGrantTypes("password", "refresh_token")
                    .authorities("USER")
                    .scopes("read", "write")
                    .resourceIds(RESOURCE_ID)
                    .secret("123456");
            // @formatter:on
        }

        @Bean
        @Primary
        public DefaultTokenServices tokenServices() {
            DefaultTokenServices tokenServices = new DefaultTokenServices();
            tokenServices.setSupportRefreshToken(true);
            tokenServices.setTokenStore(this.tokenStore);
            return tokenServices;
        }

    }
}

我什至添加了过滤器。

Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class YourCORSFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp,
                         FilterChain chain) throws IOException, ServletException {
        // TODO Auto-generated method stub
        HttpServletResponse response = (HttpServletResponse) resp;
        HttpServletRequest request = (HttpServletRequest) req;

        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "Content-Type,x-auth-token,x-requested-with,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,Authorization");
        if (request.getMethod() != "OPTIONS") {
            chain.doFilter(req, resp);
        } else {
        }

        chain.doFilter(req, resp);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void destroy() {
    }

}

【问题讨论】:

  • 大家好,请更新我

标签: spring-rest spring-oauth2


【解决方案1】:

您的过滤器始终调用chain.doFilter(req, resp),因此如果下游应用不处理 CORS 请求,那么您将看到类似的错误。

【讨论】:

  • 你好有什么办法可以解决这个问题。我关注了github.com/royclarkson/spring-rest-service-oauth
  • 我已删除此过滤器并添加了带有详细信息的 web.xml - tomcat.apache.org/tomcat-7.0-doc/config/filter.html 。我还使用 Spring-CORS 配置了 Application.java。但我仍然收到错误。我已经关注了 - github.com/royclarkson/spring-rest-service-oauth 用于 Spring-OAuth2。所以请帮助我。
  • 如果它是一个 Spring Boot 应用程序,那么 web.xml 对你没有用处。您只需要修复过滤器(尽管我不建议以这种形式将其投入生产,这完全是另一个主题)。有效的过滤器示例:github.com/spring-guides/tut-spring-security-and-angular-js/…)。
  • 其实我需要将它部署在外部tomcat服务器上。但是您共享的代码也实现了 CORSFilter ,那么先生有什么区别。另外我应该在生产中做什么。二、是否需要实现CsrfTokenRepository?
  • Spring Boot 应用没有web.xml(这很简单)。我链接的过滤器的不同之处在于它并不总是调用chain.doFilter(req, resp)(正如我已经说过的)。
猜你喜欢
  • 2020-05-31
  • 2017-05-13
  • 2021-02-27
  • 1970-01-01
  • 2015-04-04
  • 2017-11-09
  • 2020-09-08
相关资源
最近更新 更多