我的目标是保护WebSocket端点,例如ws://localhost:8080/chat

我做了什么:

  1. 我试图用STOMP创建WebSocket连接

    var socket = new SockJS("/chat"); stompClient = Stomp.over(socket); stompClient.connect({"X-XSRF-TOKEN": getCookie("XSRF-TOKEN")}, function (status) { // it should not execute. });

    AbstractSecurityWebSocketMessageBrokerConfigurer

     // see: https://docs.spring.io/spring-security/site/docs/current/reference/html5/#websocket @Configuration public class WebSocketSecurityConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer { @Override protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) { messages .nullDestMatcher().authenticated() .simpDestMatchers("/app/**").hasRole("USER") .simpDestMatchers("/user/**", "/topic/channel/*").hasRole("USER") .simpTypeMatchers(MESSAGE, SUBSCRIBE).denyAll() .anyMessage().denyAll(); } }

    WebSocketMessageBrokerConfigurer

     @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/chat").withSockJS(); // user connect to } @Override public void configureMessageBroker(MessageBrokerRegistry registry) { registry.setApplicationDestinationPrefixes("/app"); // user send message to registry.enableSimpleBroker("/topic", "/queue"); // user subscribe to .. for channel messages. registry.setUserDestinationPrefix("/user"); // user subscribe to .. for private messages. } }

    WebSecurityConfigurerAdapter

     @Configuration public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) .and() .formLogin() .and() .authorizeRequests().anyRequest().authenticated(); } }

我的预期结果是:WebSocket连接应该失败,因为我没有发送JSESSIONID。

我的实际结果是:Spring Security可以识别用户,并且我可以使用(UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal()获得UserDetails

我的问题:

  1. 如果要使用应存储的数据库,JSESSIONID或XSRF-TOKEN?

  2. 使用X-XSRF-TOKEN是保护StompCommand.CONNECT端点的正确方法吗?

  3. 为什么Spring Security要求使用X-XSRF-TOKEN而不是JSESSIONID CSRF令牌不用于防止跨站点请求伪造吗?

    如果创建的WebSocket连接在请求标头中没有X-XSRF-TOKEN的键,这是我从浏览器控制台收到的错误。

     <<< ERROR message:Failed to send message to ExecutorSubscribableChannel[clientInboundChannel]; nested exception is org.springframework.security.web.csrf.InvalidCsrfTokenException\\c Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-XSRF-TOKEN'. content-length:0

#1楼 票数:0 已采纳

我的目标是保护WebSocket端点,例如ws://localhost:8080/chat

我做了什么:

  1. 我试图用STOMP创建WebSocket连接

    var socket = new SockJS("/chat"); stompClient = Stomp.over(socket); stompClient.connect({"X-XSRF-TOKEN": getCookie("XSRF-TOKEN")}, function (status) { // it should not execute. });

    AbstractSecurityWebSocketMessageBrokerConfigurer

     // see: https://docs.spring.io/spring-security/site/docs/current/reference/html5/#websocket @Configuration public class WebSocketSecurityConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer { @Override protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) { messages .nullDestMatcher().authenticated() .simpDestMatchers("/app/**").hasRole("USER") .simpDestMatchers("/user/**", "/topic/channel/*").hasRole("USER") .simpTypeMatchers(MESSAGE, SUBSCRIBE).denyAll() .anyMessage().denyAll(); } }

    WebSocketMessageBrokerConfigurer

     @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/chat").withSockJS(); // user connect to } @Override public void configureMessageBroker(MessageBrokerRegistry registry) { registry.setApplicationDestinationPrefixes("/app"); // user send message to registry.enableSimpleBroker("/topic", "/queue"); // user subscribe to .. for channel messages. registry.setUserDestinationPrefix("/user"); // user subscribe to .. for private messages. } }

    WebSecurityConfigurerAdapter

     @Configuration public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) .and() .formLogin() .and() .authorizeRequests().anyRequest().authenticated(); } }

我的预期结果是:WebSocket连接应该失败,因为我没有发送JSESSIONID。

我的实际结果是:Spring Security可以识别用户,并且我可以使用(UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal()获得UserDetails

我的问题:

  1. 如果要使用应存储的数据库,JSESSIONID或XSRF-TOKEN?

  2. 使用X-XSRF-TOKEN是保护StompCommand.CONNECT端点的正确方法吗?

  3. 为什么Spring Security要求使用X-XSRF-TOKEN而不是JSESSIONID CSRF令牌不用于防止跨站点请求伪造吗?

    如果创建的WebSocket连接在请求标头中没有X-XSRF-TOKEN的键,这是我从浏览器控制台收到的错误。

     <<< ERROR message:Failed to send message to ExecutorSubscribableChannel[clientInboundChannel]; nested exception is org.springframework.security.web.csrf.InvalidCsrfTokenException\\c Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-XSRF-TOKEN'. content-length:0

  ask by kidfrom translate from so

未解决问题?本站智能推荐:

4回复

如何在没有密码编码的情况下使用Springsecurity?

我目前正在尝试学习 Spring 安全性。 在持久化到数据库之前,我使用BCryptPasswordEncoder对用户密码进行编码代码: 然后在身份验证期间也使用它,并且用户按预期进行了身份验证。 然后我删除了.passwordEncoder(bCryptPasswordEncoder); 从co
3回复

默认情况下如何拒绝访问所有URL?

在定义新的Spring引导REST资源时,我倾向于忘记为其url模式创建spring安全配置。 默认情况下,如何拒绝访问所有URL,并且只允许访问明确配置的URL模式? (我使用.hasRole来允许访问)我想避免尽可能多的意外安全漏洞。 假设我有三个REST资源: /jobs , /
3回复

SpringBoot,如何在不使用ldif的情况下通过LDAP进行身份验证?

我在这里尝试SpringBoot中的LDAP身份验证示例 它使用的是ldif方法,我认为该方法不适用于我的要求,因为我们的ldap管理员不会告诉我在哪里可以找到所需的ldif。 在springboot之前,我曾经使用自己的ldap实现而不使用ldif。 有没有一种方法可以验证不仅使用ld
1回复

如何在没有WebSecurityConfigurerAdapter的情况下更改HttpSecurity

我们有公司定义为核心组件的身份验证库。 这个包定义了 WebSecurityConfigurerAdapter 和 HttpSecurity 链。 有什么办法可以在应用程序初始化后对链产生影响吗? 我们需要添加一些根本不需要身份验证的路径。 谢谢你,马丁
1回复

如何在没有身份验证的情况下更新字段?

更新计数器时如何不更新审核员? 在我的数据库中,我有一个称为产品的表,我想实现一个访问计数器。 这意味着未经身份验证的任何人都可以访问此产品。 基于此,由于正在尝试更新审计程序(匿名),因此我收到以下错误: java.lang.ClassCastException:无法将java.
3回复

X-CSRF-TOKEN不是由SpringBoot生成的

我按照这里的指南: http : //spring.io/guides/gs/rest-service/来构建我的休息服务示例,现在我正在尝试启用 CSRF 保护。 我读到它应该默认启用,所以如果我不包括: http.csrf().disable() 在我的WebSecurityConfigur
1回复

浏览器重启后不带复选框的情况下,我可以使用SpringRemember-me恢复浏览器会话吗

对于以下情况,用户登录到我的应用程序并关闭浏览器,然后在一段时间后重新启动浏览器并点击我的应用程序url,则该用户应自动登录。 对于这种情况,我的朋友建议尝试使用spring记住我功能。 当我尝试了解spring时,请记住我的概念,在每个示例中都使用了一个复选框。 我可以不使用复选框来实
2回复

如何在不重启springboot的情况下使用SpringSecurity添加新用户

启动 spring boot 后,Spring Security 的配置无法更新。 如何在不重启spring boot的情况下添加新用户或更新用户密码或用户角色? 因为页面被重定向到 /login?error 页面,当我使用新密码登录时。