c语言socket鉴权,netty tcp(WebSocket)鉴权2个方案

1

增加一个AuthHandler,顶在pipeline最前面

73d02a5fd2548ff07469f4a5089775e6.png

鉴权不通过,close channel,通过,remove掉这个鉴权channelhandler

取自jds-im,msgforwarder AuthWsHandler

1e2b9b9360ad58b2739ebcea113cf01b.png

------------------------------------------------------------------------------------------------

8123a5e4b2a4ec406706bdcea5694e84.png

* ctx.pipeline().remove(this);

1.5

no remove AuthHandler

channel.attribute.get

null - 是否鉴权请求

否 close

是 鉴权

not null 直接放行ctx.fireChannelRead

2

connect时鉴权,将信息放在ws url中

前端:ws = new WebSocket(WS_URL + ";" + getCookie('token'));

服务端在握手前:

public class HttpRequestHandler extends SimpleChannelInboundHandler {

private static final Logger logger = LoggerFactory.getLogger(HttpRequestHandler.class);

public static AttributeKey TOKEN = AttributeKey.valueOf("token");

public static AttributeKey USERNAME = AttributeKey.valueOf("userName");

@Override

public void channelRead0(ChannelHandlerContext ctx, FullHttpRequest request) throws Exception {

String url = request.getUri();

if(-1 != url.indexOf("/ws")) {

String temp [] = url.split(";");

if(temp.length >= 2) {

String token = URLDecoder.decode(temp[1], "UTF-8");

ctx.channel().attr(TOKEN).set(token);

}

request.setUri("/ws");

// 传递到下一个handler:升级握手

ctx.fireChannelRead(request.retain());

} else {

logger.error("not socket");

ctx.close();

}

}

握手后:

public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {

if (evt == WebSocketServerProtocolHandler.ServerHandshakeStateEvent.HANDSHAKE_COMPLETE) {

// 移除性能更加

ctx.pipeline().remove(HttpRequestHandler.class);

boolean hasAuth = false;

String userName = null;

String token = ctx.channel().attr(HttpRequestHandler.TOKEN).get();

if(token == null || "".equals(token)) {

logger.warn("no token");

} else {

userName = GlobalContext.channelUser.get(token);

if(userName != null && !"".equals(userName)) {

ctx.channel().attr(HttpRequestHandler.USERNAME).set(userName);

hasAuth = true;

} else {

logger.warn("no user");

}

}

if(hasAuth) {

String up = userName + "[connected]";

logger.info(up);

// for(int i=0; i<100; ++i)

ctx.writeAndFlush(up);

group.add(ctx.channel());

} else {

String noToken = "[您的token非法,请重新登录]";

logger.warn(noToken);

ctx.writeAndFlush(noToken).addListener(new ChannelFutureListener() {

@Override

public void operationComplete(ChannelFuture channelFuture) throws Exception {

channelFuture.channel().close();

}

});

}

实践具体位置参见:https://www.cnblogs.com/silyvin/articles/9590595.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值