对比新文件 |
| | |
| | | package com.iailab.framework.websocket.core.security; |
| | | |
| | | import com.iailab.framework.security.core.LoginUser; |
| | | import com.iailab.framework.security.core.filter.TokenAuthenticationFilter; |
| | | import com.iailab.framework.security.core.util.SecurityFrameworkUtils; |
| | | import com.iailab.framework.websocket.core.util.WebSocketFrameworkUtils; |
| | | import org.springframework.http.server.ServerHttpRequest; |
| | | import org.springframework.http.server.ServerHttpResponse; |
| | | import org.springframework.web.socket.WebSocketHandler; |
| | | import org.springframework.web.socket.WebSocketSession; |
| | | import org.springframework.web.socket.server.HandshakeInterceptor; |
| | | |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * 登录用户的 {@link HandshakeInterceptor} 实现类 |
| | | * |
| | | * 流程如下: |
| | | * 1. 前端连接 websocket 时,会通过拼接 ?token={token} 到 ws:// 连接后,这样它可以被 {@link TokenAuthenticationFilter} 所认证通过 |
| | | * 2. {@link LoginUserHandshakeInterceptor} 负责把 {@link LoginUser} 添加到 {@link WebSocketSession} 中 |
| | | * |
| | | * @author iailab |
| | | */ |
| | | public class LoginUserHandshakeInterceptor implements HandshakeInterceptor { |
| | | |
| | | @Override |
| | | public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, |
| | | WebSocketHandler wsHandler, Map<String, Object> attributes) { |
| | | LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); |
| | | if (loginUser != null) { |
| | | WebSocketFrameworkUtils.setLoginUser(loginUser, attributes); |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | @Override |
| | | public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, |
| | | WebSocketHandler wsHandler, Exception exception) { |
| | | // do nothing |
| | | } |
| | | |
| | | } |