diff --git a/cim-boot-server/pom.xml b/cim-boot-server/pom.xml index 3979b7d..b985732 100644 --- a/cim-boot-server/pom.xml +++ b/cim-boot-server/pom.xml @@ -67,7 +67,7 @@ com.farsunset cim-server-sdk-netty - 4.2.6 + 4.2.7-SNAPSHOT org.apache.commons diff --git a/cim-boot-server/src/main/java/com/farsunset/cim/component/predicate/AuthPredicate.java b/cim-boot-server/src/main/java/com/farsunset/cim/component/predicate/AuthPredicate.java new file mode 100644 index 0000000..3fea63a --- /dev/null +++ b/cim-boot-server/src/main/java/com/farsunset/cim/component/predicate/AuthPredicate.java @@ -0,0 +1,28 @@ +package com.farsunset.cim.component.predicate; + + +import com.farsunset.cim.auth.AuthPredicateInfo; +import org.springframework.stereotype.Component; + +import java.util.function.Predicate; + +/** + * WS 鉴权验证 + */ +@Component +public class AuthPredicate implements Predicate { + + @Override + public boolean test(AuthPredicateInfo auth) { + /* + 可通过header或者uri传递参数 + String token = auth.getHeader("token"); + String token = auth.getParameter("token"); + User user = doAuth(token); + auth.getCtx().attr(AttributeKey.valueOf("user_id")).set(user.getId()); + */ + + + return true; + } +} diff --git a/cim-boot-server/src/main/java/com/farsunset/cim/component/predicate/HandshakePredicate.java b/cim-boot-server/src/main/java/com/farsunset/cim/component/predicate/HandshakePredicate.java index f04e5d2..c4b6fff 100644 --- a/cim-boot-server/src/main/java/com/farsunset/cim/component/predicate/HandshakePredicate.java +++ b/cim-boot-server/src/main/java/com/farsunset/cim/component/predicate/HandshakePredicate.java @@ -30,6 +30,7 @@ import java.util.function.Predicate; /** * WS链接握手鉴权验证 */ +@Deprecated @Component public class HandshakePredicate implements Predicate { diff --git a/cim-boot-server/src/main/java/com/farsunset/cim/config/CIMConfig.java b/cim-boot-server/src/main/java/com/farsunset/cim/config/CIMConfig.java index 8ca4bac..9b8f505 100644 --- a/cim-boot-server/src/main/java/com/farsunset/cim/config/CIMConfig.java +++ b/cim-boot-server/src/main/java/com/farsunset/cim/config/CIMConfig.java @@ -26,7 +26,7 @@ import com.farsunset.cim.acceptor.WebsocketAcceptor; import com.farsunset.cim.acceptor.config.SocketConfig; import com.farsunset.cim.acceptor.config.WebsocketConfig; import com.farsunset.cim.component.handler.annotation.CIMHandler; -import com.farsunset.cim.component.predicate.HandshakePredicate; +import com.farsunset.cim.component.predicate.AuthPredicate; import com.farsunset.cim.config.properties.APNsProperties; import com.farsunset.cim.config.properties.CIMAppSocketProperties; import com.farsunset.cim.config.properties.CIMWebsocketProperties; @@ -76,9 +76,9 @@ public class CIMConfig implements CIMRequestHandler, ApplicationListenercom.farsunset cim-server-sdk-netty - 4.2.6 + 4.2.7-SNAPSHOT jar ${project.groupId}:${project.artifactId} diff --git a/cim-server-sdk/src/main/java/com/farsunset/cim/acceptor/WebsocketAcceptor.java b/cim-server-sdk/src/main/java/com/farsunset/cim/acceptor/WebsocketAcceptor.java index f63ecc4..2572d63 100644 --- a/cim-server-sdk/src/main/java/com/farsunset/cim/acceptor/WebsocketAcceptor.java +++ b/cim-server-sdk/src/main/java/com/farsunset/cim/acceptor/WebsocketAcceptor.java @@ -22,13 +22,13 @@ package com.farsunset.cim.acceptor; import com.farsunset.cim.acceptor.config.WebsocketConfig; +import com.farsunset.cim.auth.AuthHandler; import com.farsunset.cim.coder.json.TextMessageDecoder; import com.farsunset.cim.coder.json.TextMessageEncoder; import com.farsunset.cim.coder.protobuf.WebMessageDecoder; import com.farsunset.cim.coder.protobuf.WebMessageEncoder; import com.farsunset.cim.constant.WebsocketProtocol; import com.farsunset.cim.handler.IllegalRequestHandler; -import com.farsunset.cim.handshake.HandshakeHandler; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelHandler; @@ -69,14 +69,14 @@ public class WebsocketAcceptor extends NioSocketAcceptor { private final WebsocketConfig config; - private final HandshakeHandler handshakeHandler; + private final AuthHandler authHandler; private final ChannelHandler illegalRequestHandler = new IllegalRequestHandler(); public WebsocketAcceptor(WebsocketConfig config){ super(config); this.config = config; - this.handshakeHandler = new HandshakeHandler(config.getHandshakePredicate()); + this.authHandler = new AuthHandler(config.getAuthPredicate()); } /** @@ -97,8 +97,8 @@ public class WebsocketAcceptor extends NioSocketAcceptor { ch.pipeline().addLast(new HttpServerCodec()); ch.pipeline().addLast(new ChunkedWriteHandler()); ch.pipeline().addLast(new HttpObjectAggregator(4 * 1024)); + ch.pipeline().addLast(authHandler); ch.pipeline().addLast(new WebSocketServerProtocolHandler(config.getPath(),true)); - ch.pipeline().addLast(handshakeHandler); if (config.getProtocol() == WebsocketProtocol.JSON){ ch.pipeline().addLast(new TextMessageDecoder()); ch.pipeline().addLast(new TextMessageEncoder()); diff --git a/cim-server-sdk/src/main/java/com/farsunset/cim/acceptor/config/WebsocketConfig.java b/cim-server-sdk/src/main/java/com/farsunset/cim/acceptor/config/WebsocketConfig.java index 0012cd6..6042b0b 100644 --- a/cim-server-sdk/src/main/java/com/farsunset/cim/acceptor/config/WebsocketConfig.java +++ b/cim-server-sdk/src/main/java/com/farsunset/cim/acceptor/config/WebsocketConfig.java @@ -21,6 +21,7 @@ */ package com.farsunset.cim.acceptor.config; +import com.farsunset.cim.auth.AuthPredicateInfo; import com.farsunset.cim.constant.WebsocketProtocol; import com.farsunset.cim.handshake.HandshakeEvent; @@ -50,8 +51,14 @@ public class WebsocketConfig extends SocketConfig{ /** * websocket鉴权实现 */ + @Deprecated private Predicate handshakePredicate; + /** + * 鉴权实现 + */ + private Predicate authPredicate; + @Override public Integer getPort() { @@ -83,4 +90,11 @@ public class WebsocketConfig extends SocketConfig{ this.handshakePredicate = handshakePredicate; } + public void setAuthPredicate(Predicate authPredicate) { + this.authPredicate = authPredicate; + } + + public Predicate getAuthPredicate() { + return authPredicate; + } } diff --git a/cim-server-sdk/src/main/java/com/farsunset/cim/auth/AuthHandler.java b/cim-server-sdk/src/main/java/com/farsunset/cim/auth/AuthHandler.java new file mode 100644 index 0000000..e477503 --- /dev/null +++ b/cim-server-sdk/src/main/java/com/farsunset/cim/auth/AuthHandler.java @@ -0,0 +1,56 @@ +package com.farsunset.cim.auth; + +import com.farsunset.cim.constant.CIMConstant; +import com.farsunset.cim.model.ReplyBody; +import io.netty.channel.ChannelFutureListener; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.handler.codec.http.FullHttpRequest; +import io.netty.handler.codec.http.HttpResponseStatus; + +import java.util.function.Predicate; + +/** + * 鉴权处理器 + */ +@ChannelHandler.Sharable +public class AuthHandler extends ChannelInboundHandlerAdapter { + + /* + *认证失败,返回replyBody给客户端 + */ + private final ReplyBody failedBody = ReplyBody.make(CIMConstant.CLIENT_HANDSHAKE, + HttpResponseStatus.UNAUTHORIZED.code(), + HttpResponseStatus.UNAUTHORIZED.reasonPhrase()); + + + private final Predicate authPredicate; + + + public AuthHandler(Predicate authPredicate) { + this.authPredicate = authPredicate; + } + + + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + if (msg instanceof FullHttpRequest) { + FullHttpRequest request = (FullHttpRequest) msg; + + /* + * 鉴权不通过,发送响应体并关闭链接 + */ + if (!authPredicate.test(AuthPredicateInfo.of(request, ctx))) { + ctx.channel().writeAndFlush(failedBody).addListener(ChannelFutureListener.CLOSE); + return; + } + + //鉴权通过后移除本handler + ctx.pipeline().remove(this); + } + + //other protocols + super.channelRead(ctx, msg); + } + +} diff --git a/cim-server-sdk/src/main/java/com/farsunset/cim/auth/AuthPredicateInfo.java b/cim-server-sdk/src/main/java/com/farsunset/cim/auth/AuthPredicateInfo.java new file mode 100644 index 0000000..6678f53 --- /dev/null +++ b/cim-server-sdk/src/main/java/com/farsunset/cim/auth/AuthPredicateInfo.java @@ -0,0 +1,64 @@ +package com.farsunset.cim.auth; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.http.FullHttpRequest; +import io.netty.handler.codec.http.HttpHeaders; +import io.netty.handler.codec.http.QueryStringDecoder; + +import java.util.List; + +/** + * 鉴权相关信息 + */ + +public class AuthPredicateInfo { + + private final String uri; + + private final HttpHeaders header; + + private final ChannelHandlerContext ctx; + + public AuthPredicateInfo(String uri, HttpHeaders header, ChannelHandlerContext ctx) { + this.uri = uri; + this.header = header; + this.ctx = ctx; + } + + public String getHeader(String name) { + return header.get(name); + } + + public List getHeaders(String name) { + return header.getAll(name); + } + + public Integer getIntHeader(String name) { + return header.getInt(name); + } + + public String getParameter(String name) { + QueryStringDecoder decoder = new QueryStringDecoder(uri); + List valueList = decoder.parameters().get(name); + return valueList == null || valueList.isEmpty() ? null : valueList.get(0); + } + + public List getParameters(String name) { + QueryStringDecoder decoder = new QueryStringDecoder(uri); + return decoder.parameters().get(name); + } + + public String getUri() { + return this.uri; + } + + public ChannelHandlerContext getCtx() { + return this.ctx; + } + + public static AuthPredicateInfo of(FullHttpRequest request, ChannelHandlerContext context) { + return new AuthPredicateInfo(request.uri(), request.headers(), context); + } + + +} diff --git a/cim-server-sdk/src/main/java/com/farsunset/cim/handshake/HandshakeEvent.java b/cim-server-sdk/src/main/java/com/farsunset/cim/handshake/HandshakeEvent.java index 101d26d..1a3bd07 100644 --- a/cim-server-sdk/src/main/java/com/farsunset/cim/handshake/HandshakeEvent.java +++ b/cim-server-sdk/src/main/java/com/farsunset/cim/handshake/HandshakeEvent.java @@ -31,6 +31,7 @@ import java.util.List; * websocket客户端握手请求信息 * 用于在握手阶段鉴权 */ +@Deprecated public class HandshakeEvent { private final String uri; diff --git a/cim-server-sdk/src/main/java/com/farsunset/cim/handshake/HandshakeHandler.java b/cim-server-sdk/src/main/java/com/farsunset/cim/handshake/HandshakeHandler.java index 3f97abf..a560dd5 100644 --- a/cim-server-sdk/src/main/java/com/farsunset/cim/handshake/HandshakeHandler.java +++ b/cim-server-sdk/src/main/java/com/farsunset/cim/handshake/HandshakeHandler.java @@ -35,6 +35,7 @@ import java.util.function.Predicate; /** * WS握手时鉴权 */ +@Deprecated @ChannelHandler.Sharable public class HandshakeHandler extends ChannelInboundHandlerAdapter { /*