[SPRING] websocket 메시지에서 스프링 보안 및 액세스 원칙을 사용하는 안전한 Spring-Websocket
SPRINGwebsocket 메시지에서 스프링 보안 및 액세스 원칙을 사용하는 안전한 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.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.Spring Security로 WebSocket Endpoint를 보호하고 로그인을했는지 확인하십시오. (완료되지 않은 경우 401).
Spring Security로 WebSocket Endpoint를 보호하고 로그인을했는지 확인하십시오. (완료되지 않은 경우 401).
3.2.7 및 4.0.2.RELEASE의 Testet
두 버전 모두 :
from https://stackoverflow.com/questions/25640872/secure-spring-webscoket-using-spring-security-and-access-principal-from-websocke by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 주석 기반의 트랜잭션 관리와 객체 매핑을위한 Spring 3의 최소 Hibernate 4 XML 설정? (0) | 2019.02.27 |
---|---|
[SPRING] 스프링에서의 동적 인 생성 (0) | 2019.02.27 |
[SPRING] 봄 부팅시 알 수없는 요청을 index.html로 리디렉션 (0) | 2019.02.27 |
[SPRING] 새 엔티티 + 연결 생성 중 작동하지 않음 (0) | 2019.02.27 |
[SPRING] 후행 슬래시는 Spring Boot 응용 프로그램에 삽입되지 않습니다. (0) | 2019.02.27 |