分享

Dubbo服务权限控制

 沙门空海 2020-03-26
  • Landscape
    Dubbo大多情况下应用于内网RPC API开发,在注册中心注册服务。一般情况下,项目成员间不会调用与自己业务不相关的API,但项目里多多少少会存在一些敏感的数据或信息,即使项目成员需要用到这些敏感信息数据。
    在某种场合上也需要走申请流程。为了避免服务API在内网上被透明互调,加强管理服务API调用规范,控制API的扩散范围,可以在服务API里设计过滤器,在调用服务时需要带上某种可被识别及验证的信息,验证通过,方可调用相应服务。这里我们以APP ID作为验证信息来控制API扩展范围。

  • Spring方式控制服务扩散范围

  1. 服务端创建服务过滤器

/**
 * @author: zhuocc2
 * @date: 2019-08-07 10:10:20 AM
 * @ClassName: ServiceAuthorization.java
 * @Description: TODO service authorization
 */
@Activate(group = Constants.PROVIDER)
public class ServiceAuthorization implements Filter {

    private Logger log = Logger.getLogger(ServiceAuthorization.class);
    
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        
        // 如果通过,提供服务
        String sid = invocation.getAttachment("sid");
        
        if (!StringUtils.isNullOrEmpty(sid)) {
            Properties properties = new Properties();
            InputStream inStream = ServiceAuthorization.class.getClassLoader().getResourceAsStream("config.properties");
            try {
                properties.load(inStream);
                String serviceId = properties.getProperty("sid");
                
                if (sid.equals(serviceId)) {
                    return invoker.invoke(invocation);
                } else {
                    log.info("request service fail! no authorization!");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            
        } else {
            log.info("sid为空");
        }
        
        // 不通过,拒绝服务
        return null;
    }
}
  1. config.properties配制文件

# service id
sid=U2FsdGVkX19mOiO9RA2MAJX9qgLFJZC49q3efV5MY43w=
  1. Spring配制文件增加如下配制

<dubbo:provider filter="ServiceAuthorization"/>
  1. 在资源目录下创建如下目录及文件

-conf
  -META-INF 
    -dubbo
      com.alibaba.dubbo.rpc.Filter

com.alibaba.dubbo.rpc.Filter内容如下

ServiceAuthorization=service.impl.ServiceAuthorization
  • 调用方设置APPID

  1. 创建过滤器

/**
 * @author: zhuocc2
 * @date: 2019-08-07 10:47:12 AM
 * @ClassName: RPCAuthorization.java
 * @Description: TODO RPC Service Authorization
 */
@Activate(group = Constants.CONSUMER)
public class RPCAuthorization implements Filter {

    private Logger log = Logger.getLogger(RPCAuthorization.class);
    
    // service id
    private String sid;
    
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        
        Properties properties = new Properties();
        InputStream iStream = RPCAuthorization.class.getClassLoader().getResourceAsStream("config/config.properties");
        
        try {
            properties.load(iStream);
            sid = (String) properties.get("sid");
            RpcContext.getContext().setAttachment("sid", sid);
            
            return invoker.invoke(invocation);
        } catch (IOException e) {
            e.printStackTrace();
            
        }
        
        return null;
    }
}
  1. config.properties配制文件内容

# service id
sid=U2FsdGVkX19mOiO9RA2MAJX9qgLFJZC49q3efV5MY43w=

注意,这里的sid必须与服务端sid一致,才能完成服务调用

  1. 在资源文件目录下创建如下目录及文件

-META-INF
  -dubbo
    com.alibaba.dubbo.rpc.Filter

com.alibaba.dubbo.rpc.Filter内容如下

RPCAuthorization=web.utils.RPCAuthorization

调用方无需在Spring配制文件里配制Filter。
这样即可完成基于APPID的服务权限控制

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多