WebSocket,Spring 引导中的身份验证
WebSocket, authentication in Spring Boot
我想聊天,它已经可以工作了,但我无法从 SecurityContextHolder 获取上下文,它始终为空。由于可为 nulable 的 SecurityContext,注解 @PreAuthorize 和 @Secured 也不起作用。我怎样才能得到这个上下文或主体?在普通控制器中它可以工作,但不能用于 websocket。我想在消息中添加用户的信息,请问还有其他方法吗?
我的配置:
@Configuration
@EnableWebSocketMessageBroker
@ComponentScan(basePackages = "com.antilamer.controller")
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/chat").withSockJS();
}
}
控制器:
@Controller
public class ChatController {
@MessageMapping("/chat")
@SendTo("/topic/message")
public OutputMessageDTO sendMessage(MessageDTO message) {
return new OutputMessageDTO(message, new Date()); //here i want use my SecurityContext
}
}
好的,我们不能将安全上下文与 websocket 一起使用,但我找到了获取登录用户的方法,我需要更改我的 sendMessage() 方法:
public OutputMessageDTO sendMessage(SimpMessageHeaderAccessor headerAccessor, MessageDTO message) {
return new OutputMessageDTO(message, new Date(), headerAccessor.getUser());
}
我想聊天,它已经可以工作了,但我无法从 SecurityContextHolder 获取上下文,它始终为空。由于可为 nulable 的 SecurityContext,注解 @PreAuthorize 和 @Secured 也不起作用。我怎样才能得到这个上下文或主体?在普通控制器中它可以工作,但不能用于 websocket。我想在消息中添加用户的信息,请问还有其他方法吗?
我的配置:
@Configuration
@EnableWebSocketMessageBroker
@ComponentScan(basePackages = "com.antilamer.controller")
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/chat").withSockJS();
}
}
控制器:
@Controller
public class ChatController {
@MessageMapping("/chat")
@SendTo("/topic/message")
public OutputMessageDTO sendMessage(MessageDTO message) {
return new OutputMessageDTO(message, new Date()); //here i want use my SecurityContext
}
}
好的,我们不能将安全上下文与 websocket 一起使用,但我找到了获取登录用户的方法,我需要更改我的 sendMessage() 方法:
public OutputMessageDTO sendMessage(SimpMessageHeaderAccessor headerAccessor, MessageDTO message) {
return new OutputMessageDTO(message, new Date(), headerAccessor.getUser());
}