在開發中,有時候需要限制訪問的權限,白名單就是一種方法。對於Java Web應用,Spring的攔截器可以攔截Web接口的調用;而對於dubbo接口,Spring的攔截器就不管用了。
dubbo提供了Filter擴展,可以通過自定義Filter來實現這個功能。本文通過一個事例來演示如何實現dubbo接口的IP白名單。
- 擴展Filter
實現com.alibaba.dubbo.rpc.Filter接口:
- public class AuthorityFilter implements Filter {
- private static final Logger LOGGER = LoggerFactory.getLogger(AuthorityFilter.class);
- private IpWhiteList ipWhiteList;
- //dubbo通過setter方式自動注入
- public void setIpWhiteList(IpWhiteList ipWhiteList) {
- this.ipWhiteList = ipWhiteList;
- }
- @Override
- public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
- if (!ipWhiteList.isEnabled()) {
- LOGGER.debug("白名單禁用");
- return invoker.invoke(invocation);
- }
- String clientIp = RpcContext.getContext().getRemoteHost();
- LOGGER.debug("訪問ip為{}", clientIp);
- List<String> allowedIps = ipWhiteList.getAllowedIps();
- if (allowedIps.contains(clientIp)) {
- return invoker.invoke(invocation);
- } else {
- return new RpcResult();
- }
- }
- }
dubbo自己會對這些bean進行注入,不需要再標注@Resource讓Spring注入,參見擴展點加載 - 配置文件
參考:調用攔截擴展
在resources目錄下添加純文本文件META-INF/dubbo/com.alibaba.dubbo.rpc.Filter,內容如下:
- xxxFilter=com.xxx.AuthorityFilter
- <dubbo:provider filter="xxxFilter" />
這樣就可以實現dubbo接口的IP白名單功能了。