美文网首页Dubbo
Dubbo IP白名单(多协议 + Telnet)

Dubbo IP白名单(多协议 + Telnet)

作者: _晓__ | 来源:发表于2019-10-23 14:16 被阅读0次

背景

  • 当不想改动服务消费者的时候(如服务消费者太多,改动大),只修改服务生产者,如何做服务权限控制?
  • Dubbo 使用注册中心的情况下,可通过 Dubbo Admin 中的功能配置IP白名单规则,但在 Dubbo 无使用注册中心的情况下,如何设置IP白名单?

实现

IP白名单配置类

@Getter
@Configuration
public class IpWhiteList {
 
    /**
     * 是否开启白名单
     */
    @Value("${dubbo.ipwhite.enabled:true}")
    private boolean enabled;
 
    /**
     * IP白名单列表
     */
    @Value("${dubbo.ipwhite.list}")
    private List<String> allowedIps;
}

多协议请求拦截

@Activate(group = CommonConstants.PROVIDER)
public class AccessFilter implements Filter {
 
    private IpWhiteList ipWhiteList;
 
    public AccessFilter(IpWhiteList ipWhiteList) {
        this.ipWhiteList = ipWhiteList;
    }
 
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        if (ipWhiteList.isEnabled()) {
            String remoteHost = RpcContext.getContext().getRemoteHost();
            String localHost = RpcContext.getContext().getLocalHost();
            if ((CollectionUtils.isEmpty(ipWhiteList.getAllowedIps()) && !remoteHost.equals(localHost))) {
                throw new RpcException("No Access");
            }
            if (!ipWhiteList.getAllowedIps().contains(remoteHost)) {
                throw new RpcException("No Access");
            }
        }
        return invoker.invoke(invocation);
    }
}

AccessFilter(IpWhiteList ipWhiteLis) 通过 Dubbo SPI 注入 IpWhiteList 对象。

新增配置 META-INFO/dubbo/org.apache.dubbo.rpc.Filter(若是Dubbo 2.7.0 版本以下,修改文件名为 com.alibaba.dubbo.rpc.Filter)内容,配置对应的 AccessFilter 类全限定名。

accessFilter=包名.AccessFilter

Telnet 请求拦截

@Activate(group = CommonConstants.PROVIDER)
public class TelnetHandlerWrapper implements TelnetHandler {
 
    private TelnetHandler telnetHandler;
 
    private IpWhiteList ipWhiteList;
 
    public TelnetHandlerWrapper(TelnetHandler telnetHandler, IpWhiteList ipWhiteList) {
        this.telnetHandler = telnetHandler;
        this.ipWhiteList = ipWhiteList;
    }
 
    public TelnetHandlerWrapper() {
    }
 
    @Override
    public String telnet(Channel channel, String message) throws RemotingException {
        if (ipWhiteList.isEnabled()) {
            String remoteHost = channel.getRemoteAddress().getHostString();
            String localHost = channel.getLocalAddress().getHostString();
            if (CollectionUtils.isEmpty(ipWhiteList.getAllowedIps()) && !remoteHost.equals(localHost)) {
                return "No Access";
            }
            if (!ipWhiteList.getAllowedIps().contains(remoteHost)) {
                return "No Access";
            }
        }
        return telnetHandler.telnet(channel, message);
    }
}

TelnetHandlerWrapper(TelnetHandler telnetHandler, IpWhiteList ipWhiteList) 通过 Dubbo SPI 注入具体操作的 TelnetHandlerIpWhiteList 对象。

新增文件 META-INFO/dubbo/internal/org.apache.dubbo.remoting.telnet.TelnetHandler(若是 dubbo2.7.0 版本以下,修改文件名为 com.alibaba.dubbo.remoting.telnet.TelnetHandler)内容,配置对应的 TelnetHandlerWrapper 类全限定名。

clear=包名.TelnetHandlerWrapper
exit=包名.TelnetHandlerWrapper
help=包名.TelnetHandlerWrapper
status=包名.TelnetHandlerWrapper
log=包名.TelnetHandlerWrapper
ls=包名.TelnetHandlerWrapper
ps=包名.TelnetHandlerWrapper
cd=包名.TelnetHandlerWrapper
pwd=包名.TelnetHandlerWrapper
invoke=包名.TelnetHandlerWrapper
trace=包名.TelnetHandlerWrapper
count=包名.TelnetHandlerWrapper
select=包名.TelnetHandlerWrapper
shutdown=包名.TelnetHandlerWrapper
对代码不明白地方可联系讨论或对写的不好的地方望不吝指教。

相关文章

  • Dubbo IP白名单(多协议 + Telnet)

    背景 当不想改动服务消费者的时候(如服务消费者太多,改动大),只修改服务生产者,如何做服务权限控制? Dubbo ...

  • Dubbo telnet过程介绍

    开篇 从 2.0.5 版本开始,dubbo 开始支持通过 telnet 命令来进行服务治理。通过telnet ip...

  • linux命令学习之telnet

    基本概念 telnet是基于TELNET协议的远程登录客户端程序。Telnet协议是TCP/IP协议族中的一员,是...

  • centos6.5上安装配置telnet服务

    telnet简介: Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方...

  • TCP与UDP通信

    一、TCP/IP协议 TCP/IP网络协议分为:应用层(Telnet、FTP、e-mail...)、传输层(TCP...

  • Telnet是什么?

    什么是Telnet? Telnet是远程连接服务,它工作于在tcp/ip协议的应用层。telnet命令通常用来远程...

  • Telnet Server 交叉编译

    简介 Telnet是传输控制协议/因特网协议(TCP/IP)网络(例如Internet)的登录和仿真程序。...

  • Linux命令之telnet 命令

    介绍 Telnet是常用的远程控制Web服务器的方法 Telnet协议是TCP/IP协议族中的一员,是Intern...

  • 使用telnet 登录163 邮箱

    1.telnet 是做什么用的 Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准...

  • Dubbo篇:基于Netty实现Dubbo协议编解码源码分析

    Dubbo协议解析 Dubbo协议设计参考了TCP/IP协议,包括协议头和协议体两部分。16字节报文头主要携带了魔...

网友评论

    本文标题:Dubbo IP白名单(多协议 + Telnet)

    本文链接:https://www.haomeiwen.com/subject/aaqkvctx.html