2016-09-05 166 views
0

我的目標發送消息到特定的用戶 - 從用戶的春季安全發送消息給單個用戶如果可能的話,而無需使用彈簧安全使用彈簧

我想輸入一個用戶名,並設置爲用戶名,這樣我可以使用方法convertAndSendToUser。我在網上搜索,發現兩種方法

  1. 使用DefaultHandshakeHandler設置用戶名,但這樣一來,我無法從頁面檢索用戶輸入和determineUser方法使用它
  2. 我已經用下面這段嘗試代碼

    Authentication request = new UsernamePasswordAuthenticationToken("xyz", null); SecurityContextHolder.getContext().setAuthentication(request);

    但它不工作,因爲它只是改變了該方法的用戶名,然後將其重置用戶名。 如果可能的話,是否有任何方法可以在不使用彈簧安全性的情況下將消息發送給單個用戶。在此先感謝

P.S.我是一名新手。

回答

0

您可以使用您的第一種方法設置用戶名。首先,您需要將攔截器添加到您的StompEndpointRegistry類中,然後您可以從屬性確定用戶映射並返回本金

下面是代碼:

HttpSessionHandshakeInterceptor是用於攔截在HTTP屬性和在DefaultHandshakeHandler類爲他們提供

@Configuration 
@EnableWebSocketMessageBroker 
@EnableWebMvc 
@Controller 
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { 


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

} 

public void registerStompEndpoints(StompEndpointRegistry registry) { 
    registry.addEndpoint("/chat") 
    //Method .addInterceptors for enabling interceptor 
    .addInterceptors(new HttpSessionHandshakeInterceptor()) 
    .setHandshakeHandler(new MyHandler()) 
    .withSockJS(); 
} 

class MyHandler extends DefaultHandshakeHandler{ 


    @Override 
    protected Principal determineUser(ServerHttpRequest request, WebSocketHandler wsHandler, 
      Map<String, Object> attributes) { 

//Get the Username object which you have saved as session objects 

    String name = (String)attributes.get("name"); 

//Return the User 
    return new UsernamePasswordAuthenticationToken(name, null); 
    } 
    } 

}