mirror of
https://gitee.com/farsunset/cim.git
synced 2025-07-25 17:21:46 +08:00
websocket支持握手时鉴权
This commit is contained in:
parent
ec8b4a8392
commit
fbe5e24e41
@ -141,6 +141,9 @@ CIM采用业内主流开源技术构建,易于扩展和使用,并完美支
|
|||||||
版本:4.1.0/时间:2022-02-15
|
版本:4.1.0/时间:2022-02-15
|
||||||
|
|
||||||
1.websocket支持在握手时鉴权验证
|
1.websocket支持在握手时鉴权验证
|
||||||
2.websocketPath 由 "/" 变更为 "" wss和ws链接地址后面不需要加/
|
|
||||||
|
https://www.yuque.com/yuanfangxiyang/ma4ytb/vvy3iz#mmdUX
|
||||||
|
|
||||||
|
2.支持自定义配置websocketPath
|
||||||
|
|
||||||
|
|
||||||
|
Binary file not shown.
@ -10,7 +10,6 @@ import com.farsunset.cim.sdk.server.handler.CIMRequestHandler;
|
|||||||
import com.farsunset.cim.sdk.server.model.SentBody;
|
import com.farsunset.cim.sdk.server.model.SentBody;
|
||||||
import com.farsunset.cim.service.SessionService;
|
import com.farsunset.cim.service.SessionService;
|
||||||
import io.netty.channel.Channel;
|
import io.netty.channel.Channel;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
|
||||||
import org.springframework.boot.context.event.ApplicationStartedEvent;
|
import org.springframework.boot.context.event.ApplicationStartedEvent;
|
||||||
import org.springframework.context.ApplicationContext;
|
import org.springframework.context.ApplicationContext;
|
||||||
import org.springframework.context.ApplicationListener;
|
import org.springframework.context.ApplicationListener;
|
||||||
@ -49,6 +48,7 @@ public class CIMConfig implements CIMRequestHandler, ApplicationListener<Applica
|
|||||||
return new CIMNioSocketAcceptor.Builder()
|
return new CIMNioSocketAcceptor.Builder()
|
||||||
.setAppPort(properties.getAppPort())
|
.setAppPort(properties.getAppPort())
|
||||||
.setWebsocketPort(properties.getWebsocketPort())
|
.setWebsocketPort(properties.getWebsocketPort())
|
||||||
|
.setWebsocketPath(properties.getWebsocketPath())
|
||||||
.setHandshakePredicate(handshakePredicate)
|
.setHandshakePredicate(handshakePredicate)
|
||||||
.setOuterRequestHandler(this)
|
.setOuterRequestHandler(this)
|
||||||
.build();
|
.build();
|
||||||
|
@ -54,6 +54,15 @@ public class CIMProperties {
|
|||||||
|
|
||||||
public static class Websocket {
|
public static class Websocket {
|
||||||
private Integer port;
|
private Integer port;
|
||||||
|
private String path;
|
||||||
|
|
||||||
|
public String getPath() {
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPath(String path) {
|
||||||
|
this.path = path;
|
||||||
|
}
|
||||||
|
|
||||||
public Integer getPort() {
|
public Integer getPort() {
|
||||||
return port;
|
return port;
|
||||||
@ -71,4 +80,9 @@ public class CIMProperties {
|
|||||||
public Integer getWebsocketPort() {
|
public Integer getWebsocketPort() {
|
||||||
return websocket.port;
|
return websocket.port;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getWebsocketPath() {
|
||||||
|
return websocket.path;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -34,7 +34,8 @@ spring.jpa.hibernate.naming.physical-strategy= org.hibernate.boot.model.naming.P
|
|||||||
# Redis Config #
|
# Redis Config #
|
||||||
##################################################################
|
##################################################################
|
||||||
spring.redis.host=127.0.0.1
|
spring.redis.host=127.0.0.1
|
||||||
spring.redis.password=RDSV587
|
spring.redis.port=6379
|
||||||
|
#spring.redis.password=redisv587
|
||||||
spring.redis.database=12
|
spring.redis.database=12
|
||||||
spring.redis.lettuce.pool.max-active=10
|
spring.redis.lettuce.pool.max-active=10
|
||||||
spring.redis.lettuce.pool.max-wait= 10s
|
spring.redis.lettuce.pool.max-wait= 10s
|
||||||
@ -62,6 +63,7 @@ spring.messages.basename=i18n/messages
|
|||||||
#commented to disable this port.
|
#commented to disable this port.
|
||||||
cim.app.port=23456
|
cim.app.port=23456
|
||||||
cim.websocket.port=34567
|
cim.websocket.port=34567
|
||||||
|
cim.websocket.path=/
|
||||||
|
|
||||||
#please setting your p12 info and appId.
|
#please setting your p12 info and appId.
|
||||||
cim.apns.p12.file=/apns/app.p12
|
cim.apns.p12.file=/apns/app.p12
|
||||||
|
@ -1,24 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
|
|
||||||
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
|
|
||||||
<output url="file://$MODULE_DIR$/target/classes" />
|
|
||||||
<output-test url="file://$MODULE_DIR$/target/test-classes" />
|
|
||||||
<content url="file://$MODULE_DIR$">
|
|
||||||
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
|
|
||||||
<excludeFolder url="file://$MODULE_DIR$/target" />
|
|
||||||
</content>
|
|
||||||
<orderEntry type="inheritedJdk" />
|
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
|
||||||
<orderEntry type="library" name="Maven: io.netty:netty-handler:4.1.60.Final" level="project" />
|
|
||||||
<orderEntry type="library" name="Maven: io.netty:netty-resolver:4.1.60.Final" level="project" />
|
|
||||||
<orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.60.Final" level="project" />
|
|
||||||
<orderEntry type="library" name="Maven: io.netty:netty-codec-http:4.1.60.Final" level="project" />
|
|
||||||
<orderEntry type="library" name="Maven: io.netty:netty-common:4.1.60.Final" level="project" />
|
|
||||||
<orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.60.Final" level="project" />
|
|
||||||
<orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.60.Final" level="project" />
|
|
||||||
<orderEntry type="library" name="Maven: io.netty:netty-transport-native-epoll:linux-x86_64:4.1.60.Final" level="project" />
|
|
||||||
<orderEntry type="library" name="Maven: io.netty:netty-transport-native-unix-common:4.1.60.Final" level="project" />
|
|
||||||
<orderEntry type="library" name="Maven: com.google.protobuf:protobuf-java:3.11.1" level="project" />
|
|
||||||
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.30" level="project" />
|
|
||||||
</component>
|
|
||||||
</module>
|
|
@ -58,7 +58,7 @@ import java.util.function.Predicate;
|
|||||||
public class CIMNioSocketAcceptor extends SimpleChannelInboundHandler<SentBody>{
|
public class CIMNioSocketAcceptor extends SimpleChannelInboundHandler<SentBody>{
|
||||||
private static final Logger LOGGER = LoggerFactory.getLogger(CIMNioSocketAcceptor.class);
|
private static final Logger LOGGER = LoggerFactory.getLogger(CIMNioSocketAcceptor.class);
|
||||||
|
|
||||||
private static final int PONG_TIME_OUT_COUNT = 3;
|
private static final int PONG_TIME_OUT_COUNT = 3;
|
||||||
private final ThreadFactory bossThreadFactory;
|
private final ThreadFactory bossThreadFactory;
|
||||||
private final ThreadFactory workerThreadFactory;
|
private final ThreadFactory workerThreadFactory;
|
||||||
|
|
||||||
@ -70,6 +70,7 @@ public class CIMNioSocketAcceptor extends SimpleChannelInboundHandler<SentBody>{
|
|||||||
|
|
||||||
private final Integer appPort;
|
private final Integer appPort;
|
||||||
private final Integer webPort;
|
private final Integer webPort;
|
||||||
|
private final String websocketPath;
|
||||||
private final CIMRequestHandler outerRequestHandler;
|
private final CIMRequestHandler outerRequestHandler;
|
||||||
private final HandshakeHandler handshakeHandler;
|
private final HandshakeHandler handshakeHandler;
|
||||||
|
|
||||||
@ -90,6 +91,7 @@ public class CIMNioSocketAcceptor extends SimpleChannelInboundHandler<SentBody>{
|
|||||||
this.appPort = builder.appPort;
|
this.appPort = builder.appPort;
|
||||||
this.outerRequestHandler = builder.outerRequestHandler;
|
this.outerRequestHandler = builder.outerRequestHandler;
|
||||||
this.handshakeHandler = new HandshakeHandler(builder.handshakePredicate);
|
this.handshakeHandler = new HandshakeHandler(builder.handshakePredicate);
|
||||||
|
this.websocketPath = builder.websocketPath == null ? "/" : builder.websocketPath;
|
||||||
|
|
||||||
bossThreadFactory = r -> {
|
bossThreadFactory = r -> {
|
||||||
Thread thread = new Thread(r);
|
Thread thread = new Thread(r);
|
||||||
@ -145,8 +147,8 @@ public class CIMNioSocketAcceptor extends SimpleChannelInboundHandler<SentBody>{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void destroy() {
|
public void destroy() {
|
||||||
this.destroy(appBossGroup,appWorkerGroup);
|
this.destroy(appBossGroup,appWorkerGroup);
|
||||||
this.destroy(webBossGroup,webWorkerGroup);
|
this.destroy(webBossGroup,webWorkerGroup);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -189,7 +191,7 @@ public class CIMNioSocketAcceptor extends SimpleChannelInboundHandler<SentBody>{
|
|||||||
ch.pipeline().addLast(new HttpServerCodec());
|
ch.pipeline().addLast(new HttpServerCodec());
|
||||||
ch.pipeline().addLast(new ChunkedWriteHandler());
|
ch.pipeline().addLast(new ChunkedWriteHandler());
|
||||||
ch.pipeline().addLast(new HttpObjectAggregator(4 * 1024));
|
ch.pipeline().addLast(new HttpObjectAggregator(4 * 1024));
|
||||||
ch.pipeline().addLast(new WebSocketServerProtocolHandler("",false));
|
ch.pipeline().addLast(new WebSocketServerProtocolHandler(websocketPath,false));
|
||||||
ch.pipeline().addLast(handshakeHandler);
|
ch.pipeline().addLast(handshakeHandler);
|
||||||
ch.pipeline().addLast(new WebMessageDecoder());
|
ch.pipeline().addLast(new WebMessageDecoder());
|
||||||
ch.pipeline().addLast(new WebMessageEncoder());
|
ch.pipeline().addLast(new WebMessageEncoder());
|
||||||
@ -301,6 +303,7 @@ public class CIMNioSocketAcceptor extends SimpleChannelInboundHandler<SentBody>{
|
|||||||
|
|
||||||
private Integer appPort;
|
private Integer appPort;
|
||||||
private Integer webPort;
|
private Integer webPort;
|
||||||
|
private String websocketPath;
|
||||||
private CIMRequestHandler outerRequestHandler;
|
private CIMRequestHandler outerRequestHandler;
|
||||||
private Predicate<HandshakeEvent> handshakePredicate;
|
private Predicate<HandshakeEvent> handshakePredicate;
|
||||||
|
|
||||||
@ -314,6 +317,11 @@ public class CIMNioSocketAcceptor extends SimpleChannelInboundHandler<SentBody>{
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Builder setWebsocketPath(String websocketPath) {
|
||||||
|
this.websocketPath = websocketPath;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置应用层的sentBody处理handler
|
* 设置应用层的sentBody处理handler
|
||||||
*/
|
*/
|
||||||
|
@ -38,16 +38,20 @@ import java.util.function.Predicate;
|
|||||||
@ChannelHandler.Sharable
|
@ChannelHandler.Sharable
|
||||||
public class HandshakeHandler extends ChannelInboundHandlerAdapter {
|
public class HandshakeHandler extends ChannelInboundHandlerAdapter {
|
||||||
|
|
||||||
private final Predicate<HandshakeEvent> handshakePredicate;
|
/*
|
||||||
|
客户端接收到的CloseEvent事件类型
|
||||||
|
客户端可通过该code判断是握手鉴权失败
|
||||||
|
*/
|
||||||
|
private static final int UNAUTHORIZED_CODE = 4001;
|
||||||
|
|
||||||
private final WebSocketCloseStatus closeStatus = new WebSocketCloseStatus(HttpResponseStatus.UNAUTHORIZED.code(),HttpResponseStatus.UNAUTHORIZED.reasonPhrase());
|
private final Predicate<HandshakeEvent> handshakePredicate;
|
||||||
|
|
||||||
public HandshakeHandler(Predicate<HandshakeEvent> handshakePredicate) {
|
public HandshakeHandler(Predicate<HandshakeEvent> handshakePredicate) {
|
||||||
this.handshakePredicate = handshakePredicate;
|
this.handshakePredicate = handshakePredicate;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
|
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
|
||||||
|
|
||||||
super.userEventTriggered(ctx, evt);
|
super.userEventTriggered(ctx, evt);
|
||||||
|
|
||||||
@ -67,7 +71,7 @@ public class HandshakeHandler extends ChannelInboundHandlerAdapter {
|
|||||||
* 鉴权不通过,关闭链接
|
* 鉴权不通过,关闭链接
|
||||||
*/
|
*/
|
||||||
if (!handshakePredicate.test(HandshakeEvent.of(event))) {
|
if (!handshakePredicate.test(HandshakeEvent.of(event))) {
|
||||||
context.channel().writeAndFlush(new CloseWebSocketFrame(closeStatus)).addListener(ChannelFutureListener.CLOSE);
|
context.channel().writeAndFlush(new CloseWebSocketFrame(UNAUTHORIZED_CODE,HttpResponseStatus.UNAUTHORIZED.reasonPhrase())).addListener(ChannelFutureListener.CLOSE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user