Landscape
Dubbo大多情况下应用于内网RPC API开发,在注册中心注册服务。一般情况下,项目成员间不会调用与自己业务不相关的API,但项目里多多少少会存在一些敏感的数据或信息,即使项目成员需要用到这些敏感信息数据。
在某种场合上也需要走申请流程。为了避免服务API在内网上被透明互调,加强管理服务API调用规范,控制API的扩散范围,可以在服务API里设计过滤器,在调用服务时需要带上某种可被识别及验证的信息,验证通过,方可调用相应服务。这里我们以APP ID作为验证信息来控制API扩展范围。Spring方式控制服务扩散范围
- 服务端创建服务过滤器
/**
* @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;
}
}
- config.properties配制文件
# service id
sid=U2FsdGVkX19mOiO9RA2MAJX9qgLFJZC49q3efV5MY43w=
- Spring配制文件增加如下配制
<dubbo:provider filter="ServiceAuthorization"/>
- 在资源目录下创建如下目录及文件
-conf
-META-INF
-dubbo
com.alibaba.dubbo.rpc.Filter
com.alibaba.dubbo.rpc.Filter内容如下
ServiceAuthorization=service.impl.ServiceAuthorization
- 调用方设置APPID
- 创建过滤器
/**
* @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;
}
}
- config.properties配制文件内容
# service id
sid=U2FsdGVkX19mOiO9RA2MAJX9qgLFJZC49q3efV5MY43w=
注意,这里的sid必须与服务端sid一致,才能完成服务调用
- 在资源文件目录下创建如下目录及文件
-META-INF
-dubbo
com.alibaba.dubbo.rpc.Filter
com.alibaba.dubbo.rpc.Filter内容如下
RPCAuthorization=web.utils.RPCAuthorization
调用方无需在Spring配制文件里配制Filter。
这样即可完成基于APPID的服务权限控制