当前位置: 首页 > 知识库问答 >
问题:

CORS在带有OAuth2的Spring 4.3上不工作

顾均
2023-03-14

这是我在使用Angular 1.5应用程序发出请求时Chrome控制台中得到的:

XMLHttpRequest无法加载http://localhost:8080/api/oauth/token.对预检请求的响应没有通过权限改造检查:请求的资源上没有“访问控制允许起源”标头。因此不允许访问起源“http://localhost:8000”。响应的HTTP状态代码为401。

当我删除OAuth2配置时,错误消失了。

这是我的CORS配置:

class AppWebSpringConfig extends WebMvcConfigurerAdapter implements ServletContextAware {

...

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowedHeaders("X-Requested-With", "X-Auth-Token", "Origin", "Content-Type", "Accept")
                .allowCredentials(false)
                .maxAge(3600);
    }

...
}

和我的OAuth2配置类:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {

    @Override
    protected MethodSecurityExpressionHandler createExpressionHandler() {
        return new OAuth2MethodSecurityExpressionHandler();
    }

}

@Configuration
class OAuth2ServerConfiguration {

    private static final int ONE_HOUR = 3600;
    private static final int THIRTY_DAYS = 2592000;

    @Configuration
    @EnableResourceServer
    protected static class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {

        @Override
        public void configure(HttpSecurity http) throws Exception {
            // @formatter:off
            http
                    .authorizeRequests()
                    .anyRequest().authenticated();
            // @formatter:on
        }

    }

    @Configuration
    @EnableAuthorizationServer
    protected static class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {

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

        @Autowired
        private UserSecurityService userSecurityService;

        @Autowired
        private DataSource dataSource;

        @Autowired
        private Environment env;

        @Override
        public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
            // @formatter:off
            endpoints
                    .tokenStore(tokenStore())
                    .authenticationManager(authenticationManager)
                    .userDetailsService(userSecurityService);
            // @formatter:on
        }

        @Bean
        public TokenStore tokenStore() {
            return new JdbcTokenStore(dataSource);
        }

        @Override
        public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
            // @formatter:off
            clients
                    .jdbc(dataSource)
                    .withClient(env.getProperty(CLIENT_ID_WEB))
                    .secret(env.getProperty(CLIENT_SECRET_WEB))
                    .authorizedGrantTypes("password", "refresh_token")
                    .scopes("read", "write")
                    .accessTokenValiditySeconds(ONE_HOUR)
                    .refreshTokenValiditySeconds(THIRTY_DAYS);
            // @formatter:on
        }

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

    }

}

编辑:我还尝试了以下过滤器实现,但不起作用。我在doFilter()方法中放置了一个断点,但执行并没有停止,就像我的过滤器没有注册一样。然而,当我为过滤器添加默认构造函数并在其中放置断点时,它停止了,这意味着过滤器已注册。

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

    public SimpleCorsFilter() {
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        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", "x-requested-with, authorization");

        if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
        } else {
            chain.doFilter(req, res);
        }
    }

    @Override
    public void init(FilterConfig filterConfig) {
    }

    @Override
    public void destroy() {
    }
}

我也尝试了这种方法,但再次没有成功:允许选项HTTP方法用于oauth/令牌请求

我认为OAuth2配置甚至不允许请求通过配置的CORS过滤器。有人知道这个问题的解决方案吗?

EDIT2:原来有一门课:

public class AppSecurityInitializer extends AbstractSecurityWebApplicationInitializer {

    // nothing here, using defaults

}

一旦我对其进行了评论,CORS配置开始工作(可能是由于过滤器通过),但现在我的OAuth2配置根本不工作!每个URL都是公开的,没有安全性。有什么想法吗?

共有1个答案

刁文光
2023-03-14

Hiii I与spring 4.3有相同的问题,但解决方法如下:-

您需要在AuthorizationServerConfiguration类中重写AuthorizationServerConfigurerAdapter的以下方法,并使用AuthorizationServerSecurityConfiguration的addTokenEndpointAuthenticationFilter方法在其中添加CORS筛选器,如下所示:-

 @Override
 public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
       security.addTokenEndpointAuthenticationFilter(new CORSFilter());
 }

您的AuthorizationServerConfiguration类将是:-

 @Configuration
    @EnableAuthorizationServer
    protected static class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {

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

        @Autowired
        private UserSecurityService userSecurityService;

        @Autowired
        private DataSource dataSource;

        @Autowired
        private Environment env;

        @Override
        public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
            // @formatter:off
            endpoints
                    .tokenStore(tokenStore())
                    .authenticationManager(authenticationManager)
                    .userDetailsService(userSecurityService);
            // @formatter:on
        }

        @Bean
        public TokenStore tokenStore() {
            return new JdbcTokenStore(dataSource);
        }

        @Override
        public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
            // @formatter:off
            clients
                    .jdbc(dataSource)
                    .withClient(env.getProperty(CLIENT_ID_WEB))
                    .secret(env.getProperty(CLIENT_SECRET_WEB))
                    .authorizedGrantTypes("password", "refresh_token")
                    .scopes("read", "write")
                    .accessTokenValiditySeconds(ONE_HOUR)
                    .refreshTokenValiditySeconds(THIRTY_DAYS);
            // @formatter:on
        }

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

        // ***** Here I added CORS filter *****
        @Override
        public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
              security.addTokenEndpointAuthenticationFilter(new CORSFilter());
        }  
}
 类似资料:
  • 我试图从一个应用程序(spring-boot应用程序)调用另一个应用程序(angularjs)上的RESTendpoint。应用程序正在下列主机和端口上运行。 REST应用程序,使用Spring Boot, HTML应用程序,使用angularjs, 处理程序所做的只是根据用户是否登录、身份验证失败或注销,写出类似的JSON响应。如下所示。 对我错过了什么或者做错了什么有什么想法吗?

  • 我已经在我的Web API控制器上启用了CORS支持,它在https上运行良好,但在http上,我仍然收到请求的资源错误上存在的o“Access Control Allow Origin”头。 在WebApiConfig中,我使用以下行启用了cors: 我的控制器类是这样介绍的: 那么如何在http和https上启用CORS呢? 在azure原始http日志上,创建一个调用时会出现以下行:

  • 我在django中使用spotify API/spotipy,需要用户登录到他们的帐户才能访问他们的数据。我使用了“pip3 install django-cors-Headers”并将适当的部分添加到settings.py. 即使这样,我仍然收到有关缺少访问控制允许源标头的错误,并且spotify登录页面无法打开。 jquery.min.js:2 XHR完成加载:GET"http://local

  • 我有一个奇怪的问题,每天我的AJAX请求一个网站不再工作。 我现在正在努力使它工作,但找不到问题。 这是我的JavaScript:基本上它非常简单,它检索ip adres并将其发送到存储它的站点。 在服务器上,我现在添加了这一项,以避免使用通配符 当我只使用 头('access-control-allow-origin:');我得到错误:Cross-Origin-request blocked:C

  • 使用add-user.bat向application-users.properties添加一个新的应用程序用户guest/guest 添加以下StompConfiguration(缩写): 这在启动时似乎很有效: 错误[org.springframework.messaging.simp.stomp.stompbrokerrelaymessagehandler](reactor-tcp-io-1)

  • 我希望你能帮我一把。杰斯纽比。我正在编写一个小应用程序,需要调用darksky的天气api。网 通过php它工作得很好。现在,我希望通过vue更具动态性。js。但如果我通过axios进行api调用,我会得到以下消息: 加载失败 我红色了很多关于cors的东西,并试图包括中间件的标题,正如这里所解释的,我甚至尝试了berryvhd的“laravel-cors”包,但我正在运行“不”访问控制- 你对我