Dubbo接口受权

Dubbo是阿里巴巴开源的一个分布式服务框架,在咱们 贝聊内部,普遍地使用了这个框架。

使用Dubbo能够很方便地进行远程服务调用,在同一个注册中心,业务系统能够随意调用其余服务。可是有时候咱们但愿某些接口只有符合条件的用户才能调用,其余人不能随意调用。

Dubbo自己没有接口的受权机制,咱们决定为Dubbo加上这个机制。大体是这样:

受权应该知足不一样的粒度:
bash

  • 全部接口
  • 部分接口
  • 某个接口
同时,若是受权服务不可用,不该该影响接口的访问。


在Dubbo中,provider能够经过实现com.alibaba.dubbo.rpc.Filter对接口的调用进行处理:
app

/**
 * 处理Dubbo接口受权
 */
public class AuthorizationFilter implements Filter {

    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        if (受权经过) {
            return invoker.invoke(invocation);
        }
        else {
            // TODO 错误处理
        }
    }
}
复制代码
Dubbo配置:
<dubbo:provider filter="自定义filter的名称"/>
复制代码
那么,如何知道调用者是谁?咱们能够给每一个系统分配一个ID,好比叫appId。

consumer经过attachment把appId传递给provider,那么provider就知道是谁发起调用了,在consumer能够这样设置:
RpcContext.getContext().setAttachment("appId", "someAppId");
复制代码
在provider读取appId:
String appId = invocation.getAttachment("appId");
复制代码
权限的设计就比较简单了:
权限粒度能够根据本身的须要设计。

还能够实现更复杂的验证,好比加上时间戳、签名。可是设置这些attachment对于consumer是比较麻烦的,每次调用都要设置,若是未来规则变化,就更麻烦了。

因而咱们再写一个filter处理consumer的attachment:
public class ConsumerContextFilter implements Filter {
    /*
     * TODO 经过读取配置或注入appId
     */
    private String appId;
    
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        // 设置appId
        RpcContext.getContext().setAttachment("appId", appId);
        
        // 执行接口
        return invoker.invoke(invocation);
    }
}
复制代码
这样 consumer 经过配置 filter 的方式就完成了受权参数的设置,全部调用 provider 的代码不须要作任何修改。 至此,一个简单的Dubbo接口受权机制就完成了。
相关文章
相关标签/搜索