首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用spring发送特定于用户的消息

用spring发送特定于用户的消息
EN

Stack Overflow用户
提问于 2018-11-18 08:28:12
回答 1查看 844关注 0票数 0

我有一个端点(/create),它有一些逻辑,它需要3-4分钟来处理,所以我使用了rabbitmq,当端点接收到请求时,它将接收主体并在rabbitmq中发布消息,侦听器侦听消息并处理请求,现在我想通知用户,他的请求已经成功处理。

  • 是否对此要求进行了正确的选择?
  • 还有其他更好的方法来实现我的目标吗?

因此,我继续使用websocket,因为我使用基于oauth的身份验证,所以我无法获得web套接字的工作。

这是我写的代码:

SocketConfig.java

代码语言:javascript
复制
@Configuration
@EnableWebSocketMessageBroker
public class SocketConfig implements WebSocketMessageBrokerConfigurer {

  @Override
  public void configureMessageBroker(MessageBrokerRegistry config) {
    config.enableSimpleBroker("/topic","/secured/queue");
    //config.setApplicationDestinationPrefixes("/app");
    //config.setUserDestinationPrefix("/secured/user");
  }

  @Override
  public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/secured/messagereg").setAllowedOrigins("*").withSockJS();
  }

SocketHandler.java

代码语言:javascript
复制
@Configuration
public class SocketHandler extends AbstractSecurityWebSocketMessageBrokerConfigurer {

  @Override
  protected boolean sameOriginDisabled() {
    return true;
  }

  @Override
  protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) {
    messages
        .simpDestMatchers("/secured/**", "/secured/**/**").authenticated()
        .anyMessage().authenticated();
  }
}

WebSecurityConfig.java

代码语言:javascript
复制
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
@Profile("!test")
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

  @Autowired
  private Auth0PropertyConfig config;

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    JwtWebSecurityConfigurer
        .forRS256(config.getAudience(), config.getIssuer())
        .configure(http)
        .cors()
        .and()
        .csrf().disable()
        .authorizeRequests()
        .anyRequest().authenticated()
        .and()
        .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
    ;
  }
}

clientCode

代码语言:javascript
复制
 const socket = new SockJs("/secured/messagereg/?access_token="+token);
    this.setState({ clientRef: Stomp.over(socket) }, () =>
      this.state.clientRef.connect({},
        frame => {
          this.setState({ connection: true });
          this.state.clientRef.subscribe("/user/secured/queue/reply", message => {
            console.log("asd received ----------" + message.body);
            this.setState(prevs => ({
              message: [...prevs.message, message]
            }));
          });
        },
        error => {
          console.log("Stomp protocol error." + error);
        }
      )
    );

我得到401未经授权,而连接到套接字。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-18 21:56:48

在我看来:推送消息模式(例如使用STOMP)适合这个场景,但这最终取决于您的体系结构原则。您还可以轮询服务器的结果(使用REST ),这既有优点(共享安全体系结构),也有缺点(客户端代码、流量和反应时间开销)。

答案:

为了使您的代码正常工作,我认为您需要在SocketConfig.java中再使用一个方法,它将连接到您的OAUTH过滤器(或任何可能已经到位的方法)。

重要的是- websocket auth不重用现有的Security 。这就是为什么您需要再次实现auth,例如在SocketConfig类中使用WebSocketMessageBrokerConfigurer的方法configureClientInboundChannel

下面的示例假设您以前已经获得了OAUTH令牌,并且它只用于重新验证websocket连接。在StompHeaderAccessor中设置用户引用(第3行)将使您的代码能够向正确的用户发送消息。

它还要求在消息头中设置OAUTH令牌,而不是在示例中设置端点参数。我认为这对于websocks消息来说可能更安全,因为如果您使用wss,消息本身在协议级别上是加密的。

代码语言:javascript
复制
@Autowired
private YourOauthService auth;

@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
    registration.interceptors(new ChannelInterceptor() {
        @Override
        public Message<?> preSend(Message<?> message, MessageChannel channel) {
            StompHeaderAccessor accessor =
                    MessageHeaderAccessor.getAccessor(message,
                           StompHeaderAccessor.class);
            if (StompCommand.CONNECT.equals(accessor.getCommand())) {
                String token = accessor.removeNativeHeader("Authorization").get(0);
                Authentication user = auth.getAuthentication(token);

                accessor.setUser(user);
            }
            return message;
        }
    });
}

我在https://robertleggett.wordpress.com/2015/05/27/websockets-with-spring-spring-security/中找到了一些更有趣的例子

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53359087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档