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

Spring Security和Websocket的CORS问题

连俊智
2023-03-14

我正在开发一个基于Spring后端的Ionic应用程序。我通过JWT身份验证实现了Spring Security。我的应用程序将有一个聊天室,用户可以在其中进行私人或公共聊天。所以,我正在实现一个WebSocket系统,以便实时获取所有更新。

这是我的安全配置:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private JwtAuthenticationEntryPoint unauthorizedHandler;

    @Autowired
    private UserDetailsService userDetailsService;

    private AuthenticationManager authenticationManager;

    @Autowired
    public void configureAuthentication(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception {
        authenticationManagerBuilder
                .userDetailsService(this.userDetailsService)
                .passwordEncoder(passwordEncoder());
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public JwtAuthenticationTokenFilter authenticationTokenFilterBean() throws Exception {
        return new JwtAuthenticationTokenFilter();
    }

   // configurazione Cors per poter consumare le api restful con richieste ajax
    @Bean
    CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.addAllowedOrigin("*");
        configuration.setAllowedMethods(Arrays.asList("POST, PUT, GET, OPTIONS, DELETE"));
        configuration.addAllowedHeader("*");
        configuration.addAllowedMethod("*");
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }


    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
         httpSecurity
         .csrf().disable()
         .addFilterBefore(authenticationTokenFilterBean(), UsernamePasswordAuthenticationFilter.class)
         .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()
         .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().cors().and()
         .authorizeRequests()
         .antMatchers(
                 HttpMethod.GET,
                 "/",
                 "/*.html",
                 "/favicon.ico",
                 "/**/*.html",
                 "/**/*.css",
                 "/**/*.js",
                 "/image/**").permitAll()
         .antMatchers("/socket/**").permitAll()
         .antMatchers("/public/**").permitAll().and()
         .authorizeRequests().anyRequest().authenticated().and();

         httpSecurity.headers().cacheControl();
    }

    @Bean
    public AuthenticationManager customAuthenticationManager() throws Exception {
        return authenticationManager();
    }
}

这是我的WebSocket配置:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration extends AbstractWebSocketMessageBrokerConfigurer{
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/socket")
                .setAllowedOrigins("*")
                .withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.setApplicationDestinationPrefixes("/chat")
                .enableSimpleBroker("/subscribe");
    }
}

在这种情况下,我目前面临这个错误:

在“http://localhost:8080/spring app/socket/info?CORS策略已阻止来自源“http://localhost:8100”的“t=1547732425329”:当请求的凭据模式为“include”时,响应中“Access-Control-Allow-Origin”标头的值不能是通配符“*”。XMLHttpRequest发起的请求的凭据模式由withCredentials属性控制。

每个调用都在工作(我完全授权jwt),但WebSocket无法工作。

所以我试着简单地移除。我的安全配置类的configure方法中的cors()。这让我想到了一个相反问题:

镀铬错误

事实上,现在WebSocket工作得很好,而不是每个api调用给我401。

解决这个问题的正确方法是什么?谢谢你。

共有1个答案

干照
2023-03-14

是的,当我在我的一个项目中处理相关问题时,我也遇到了同样的错误。解决方案是我必须将allowed-origin头值设置为我的应用程序的URL。如果发送凭据,则不允许使用通配符值(*)。

 类似资料:
  • 我正在设置Angular Spring Security模块来登录和注册用户。当我注册一个用户时,一切都正常。注册后的最后一步是自动登录,但我遇到了以下错误: XMLHttpRequest无法加载超文本传输协议//localhost:8080/com-tesis/login.请求的资源上不存在“访问控制允许起源”标头。因此不允许访问起源“超文本传输协议//localhost:9000”。响应的HT

  • 问题内容: 我目前正在尝试在NodeJS + React App中实现Auth0。尽管存在一个大问题,但给出的本教程确实非常有用且很有帮助。每次我尝试通过Auth0登录/注册时,都会收到 XMLHttpRequest无法加载 https://XYZ.eu.auth0.com/usernamepassword/login。对预检请求的响应未通过访问控制检查:在所请求的资源上不存在“ Access-C

  • 问题内容: 由于某种原因,每当我尝试将一些数据发布到api服务器时,都会出现以下两个错误。 这是我的客户端有角JS代码,试图发送一些简单数据。该代码当前正在位于以下位置的Nginx服务器上运行 这是我的节点JS代码,用于处理“处理”请求 问题答案: 如错误消息所述,您必须在对预检的响应中确认Content-Type标头。这可能是由于您的请求的非“简单” Content- Type(表面上是appl

  • 问题内容: 我有一个基于@RestController和AngularJS的简单项目。我可以将Angular的GET请求发送到@RestController,但无法发送POST请求。我在浏览器控制台中出错: XMLHttpRequest无法加载http:// localhost:8080 / add 。Access-Control-Allow- Headers不允许请求标头字段Content-Ty

  • 我将vuejs与nodejs一起使用,vue客户端地址,nodejs服务器地址。 响应中的错误是

  • 下面的问题怎么解决?

  • 问题内容: 我试图在获得图像之前先在画布上绘制图像,但是返回的数据就像是空的。 当我在控制台中检查它时,我发现字符串中有很多:() 当我尝试将画布附加到文档时,也没有绘制任何内容,并且控制台中没有引发任何错误。 这里有什么问题 ? 这是我的代码: 另外,进行快速刷新时,图像会正确绘制到画布上,但是控制台中出现错误消息,并且为空。 Firefox中的消息是: “ SecurityError:操作不安

  • 我想在我的页面中获取数据,如果我运行: 获取http://localhost:8000/api/posts net::err_aborted401(未经授权) CORS策略阻止从来源“http://localhost:3000”访问位于“http://localhost:8000/api/posts”的XMLHttpRequest:请求的资源上没有“access-control-allog-ori