복붙노트

[SPRING] websocket 메시지에서 스프링 보안 및 액세스 원칙을 사용하는 안전한 Spring-Websocket

SPRING

websocket 메시지에서 스프링 보안 및 액세스 원칙을 사용하는 안전한 Spring-Websocket

Spring Security는 인증 및 권한 부여에 널리 사용되는 매우 훌륭한 프레임 워크입니다.

나는 응용 프로그램이 j_spring_security_check을 사용하여 인증되고 승인 된 사용자 만 websocket 처리기에 요청할 수있는 요구 사항이 있습니다.

http://malalanayake.wordpress.com/2014/06/27/spring-security-on-rest-api/에 따라 스프링 보안을 구성했습니다.

그리고 http://syntx.io/using-websockets-in-java-using-spring-4/에 따라 websocket을 설정했습니다.

다음과 같이 handleTextMessage 핸들러에서 MyPrincipal principal 객체에 액세스하려고합니다.

    @Override
    protected void handleTextMessage(WebSocketSession session,
            TextMessage message) throws Exception {
        System.out.println("Protocol: "+session.getAcceptedProtocol());
        TextMessage returnMessage = new TextMessage(message.getPayload()
                + " received at server");
        System.out.println("myAttrib="
                + session.getAttributes().get("myAttrib"));
        MyPrincipal user = (MyPrincipal) ((Authentication) session
                .getPrincipal()).getPrincipal();
        System.out.println("User: " + user.getUserId());
        session.sendMessage(returnMessage);
    }

빨리 회신 해주십시오.

해결법

  1. ==============================

    1.WebSocket 구성에서 HttpSessionHandshakeInterceptor를 추가하면 Spring 보안 주체 객체를 SpringSecurityContext에서 WebsocketSession으로 전달할 수 있습니다.

    WebSocket 구성에서 HttpSessionHandshakeInterceptor를 추가하면 Spring 보안 주체 객체를 SpringSecurityContext에서 WebsocketSession으로 전달할 수 있습니다.

    편집하다: HandshakeInterceptor.java

    public class HandshakeInterceptor extends HttpSessionHandshakeInterceptor{
    
        @Override
        public boolean beforeHandshake(ServerHttpRequest request,
                ServerHttpResponse response, WebSocketHandler wsHandler,
                Map<String, Object> attributes) throws Exception {
            System.out.println("Before Handshake");
            return super.beforeHandshake(request, response, wsHandler, attributes);
        }
    
        @Override
        public void afterHandshake(ServerHttpRequest request,
                ServerHttpResponse response, WebSocketHandler wsHandler,
                Exception ex) {
            System.out.println("After Handshake");
            super.afterHandshake(request, response, wsHandler, ex);
        }
    
    }
    

    websocket.xml

    <bean id="websocket" class="co.syntx.example.websocket.handler.WebsocketEndPoint"/>
    
    <websocket:handlers>
        <websocket:mapping path="/websocket" handler="websocket"/>
        <websocket:handshake-interceptors>
        <bean class="co.syntx.example.websocket.HandshakeInterceptor"/>
        </websocket:handshake-interceptors>
    </websocket:handlers>
    
  2. ==============================

    2.Spring Security로 WebSocket Endpoint를 보호하고 로그인을했는지 확인하십시오. (완료되지 않은 경우 401).

    Spring Security로 WebSocket Endpoint를 보호하고 로그인을했는지 확인하십시오. (완료되지 않은 경우 401).

    3.2.7 및 4.0.2.RELEASE의 Testet

    두 버전 모두 :

  3. from https://stackoverflow.com/questions/25640872/secure-spring-webscoket-using-spring-security-and-access-principal-from-websocke by cc-by-sa and MIT license