Spring Boot、 Spring Cloud 基于Filter 的Dubbo服务权限控制

简介: Spring Boot、 Spring Cloud 基于Filter 的Dubbo服务权限控制

1,首先引入依赖

<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo</artifactId>
</dependency>
AI 代码解读

2,编写代码

package org.jeckxu.magical.core.dubbo.interceptor.props;

import com.google.common.collect.Maps;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * @author jeckxu
 */
@Data
@Component(DubboAuthProperties.BEAN_NAME)
@ConfigurationProperties(DubboAuthProperties.PREFIX)
public class DubboAuthProperties implements Serializable {

    public static final String PREFIX = "magical.dubbo.auth";

    public static final String BEAN_NAME = "dubboAuthProperties";

    /**
     * 是否开启Dubbo 服务鉴权:默认为:false
     */
    private Boolean enabled = Boolean.FALSE;

    private Map<String, List<String>> appIdAllowedOfPath = Maps.newHashMap();
}
AI 代码解读
package org.jeckxu.magical.core.dubbo.interceptor.constants;

/**
 * @author jeckxu
 */
public interface DubboConstants {

    String PROVIDER = "provider";

    String CONSUMER = "consumer";

    String TRACE_ID = "traceId";
}
AI 代码解读
package org.jeckxu.magical.core.dubbo.interceptor;

import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.common.extension.Activate;
import org.apache.dubbo.rpc.*;
import org.jeckxu.magical.core.dubbo.interceptor.constants.DubboConstants;
import org.jeckxu.magical.core.tool.api.R;
import org.jeckxu.magical.core.tool.utils.StringUtil;
import org.springframework.boot.system.SystemProperties;

/**
 * @author jeckxu
 */
@Slf4j
@Activate(group = {DubboConstants.CONSUMER})
public class DubboConsumerAuthFilter implements Filter {
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        String appId = SystemProperties.get("spring.application.name");
        String currentPath = invoker.getUrl().getPath().concat("." + invocation.getMethodName());
        if (StringUtil.isNotBlank(appId)) {
            RpcContext.getContext().setAttachment("app_id", appId);
            return invoker.invoke(invocation);
        } else {
            log.error(" [DUBBO] Consumer 获取服务名称失败,Dubbo Consumer 停止调用!Path:".concat(currentPath));
            return AsyncRpcResult.newDefaultAsyncResult(
                R.fail("Consumer 获取服务名称失败,Dubbo Consumer 停止调用!Path:" + currentPath), invocation);
        }
    }
}
AI 代码解读
package org.jeckxu.magical.core.dubbo.interceptor;

import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.common.extension.Activate;
import org.apache.dubbo.common.extension.ExtensionFactory;
import org.apache.dubbo.common.extension.ExtensionLoader;
import org.apache.dubbo.rpc.*;
import org.jeckxu.magical.core.dubbo.interceptor.constants.DubboConstants;
import org.jeckxu.magical.core.dubbo.interceptor.props.DubboAuthProperties;
import org.jeckxu.magical.core.tool.api.R;

import java.util.List;


/**
 * @author jeckxu
 */
@Slf4j
@Activate(group = {DubboConstants.PROVIDER})
public class DubboProviderAuthFilter implements Filter {

    ExtensionFactory objectFactory =
        ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension();

    private final DubboAuthProperties dubboAuthProperties
        = objectFactory.getExtension(DubboAuthProperties.class, DubboAuthProperties.BEAN_NAME);


    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        if (dubboAuthProperties.getEnabled()) {
            String appId = RpcContext.getContext().getAttachment("app_id");
            String currentPath = invoker.getUrl().getPath().concat("." + invocation.getMethodName());
            List<String> currentPathAllowedAppIds = dubboAuthProperties.getAppIdAllowedOfPath().get(currentPath);
            if (null == currentPathAllowedAppIds) {
                log.warn(" [DUBBO] Provider 该接口无权限配置,请留意!Path:{},AppId:{}", currentPath, appId);
                return invoker.invoke(invocation);
            }
            if (currentPathAllowedAppIds.contains(appId)) {
                return invoker.invoke(invocation);
            } else {
                log.error(" [DUBBO] Provider 接口鉴权失败,无法提供服务!Path:{},AppId:{}", currentPath, appId);
                return AsyncRpcResult.newDefaultAsyncResult(R.fail("Provider 接口鉴权失败,无法提供服务!Path:"
                    + currentPath + ",AppId:" + appId), invocation);
            }
        } else {
            return invoker.invoke(invocation);
        }
    }
}
AI 代码解读

以上就是基于Filter 实现的Dubbo服务权限控制代码了,现在我们在Dubbo 服务的Provider端编写配置文件。

magical:
  dubbo:
    auth:
      enabled: true
      app-id-allowed-of-path:
        org.jeckxu.magical.system.user.rpc.AuthRpc.adminLogin:
          - aaaaa
AI 代码解读

现在,只有AppId 为 aaaaa 的 Dubbo Consumer 端才可以调用 org.jeckxu.magical.system.user.rpc.AuthRpc.adminLogin 服务。

配合Spring Cloud Alibaba Nacos组件可以实现动态配置。

目录
相关文章
对话即服务:Spring Boot整合MCP让你的CRUD系统秒变AI助手
本文介绍了如何通过Model Context Protocol (MCP) 协议将传统Spring Boot服务改造为支持AI交互的智能系统。MCP作为“万能适配器”,让AI以统一方式与多种服务和数据源交互,降低开发复杂度。文章以图书管理服务为例,详细说明了引入依赖、配置MCP服务器、改造服务方法(注解方式或函数Bean方式)及接口测试的全流程。最终实现用户通过自然语言查询数据库的功能,展示了MCP在简化AI集成、提升系统易用性方面的价值。未来,“对话即服务”有望成为主流开发范式。
3762 7
Spring Cloud Alibaba与Spring Cloud区别和联系?
Spring Cloud Alibaba与Spring Cloud区别和联系?
🛡️Spring Boot 3 整合 Spring Cloud Gateway 工程实践
本文介绍了如何使用Spring Cloud Alibaba 2023.0.0.0技术栈构建微服务网关,以应对微服务架构中流量治理与安全管控的复杂性。通过一个包含鉴权服务、文件服务和主服务的项目,详细讲解了网关的整合与功能开发。首先,通过统一路由配置,将所有请求集中到网关进行管理;其次,实现了限流防刷功能,防止恶意刷接口;最后,添加了登录鉴权机制,确保用户身份验证。整个过程结合Nacos注册中心,确保服务注册与配置管理的高效性。通过这些实践,帮助开发者更好地理解和应用微服务网关。
477 0
🛡️Spring Boot 3 整合 Spring Cloud Gateway 工程实践
基于SpringBoot+Vue实现的家政服务管理平台设计与实现(计算机毕设项目实战+源码+文档)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
基于SpringBoot+Vue实现的大学生就业服务平台设计与实现(系统源码+文档+数据库+部署等)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
AI 时代:从 Spring Cloud Alibaba 到 Spring AI Alibaba
本次分享由阿里云智能集团云原生微服务技术负责人李艳林主讲,主题为“AI时代:从Spring Cloud Alibaba到Spring AI Alibaba”。内容涵盖应用架构演进、AI agent框架发展趋势及Spring AI Alibaba的重磅发布。分享介绍了AI原生架构与传统架构的融合,强调了API优先、事件驱动和AI运维的重要性。同时,详细解析了Spring AI Alibaba的三层抽象设计,包括模型支持、工作流智能体编排及生产可用性构建能力,确保安全合规、高效部署与可观测性。最后,结合实际案例展示了如何利用私域数据优化AI应用,提升业务价值。
559 4
在 Spring 配置文件中配置 Filter 的步骤
【10月更文挑战第21天】在 Spring 配置文件中配置 Filter 是实现请求过滤的重要手段。通过合理的配置,可以灵活地对请求进行处理,满足各种应用需求。还可以根据具体的项目要求和实际情况,进一步深入研究和优化 Filter 的配置,以提高应用的性能和安全性。
Spring Filter深度解析
【10月更文挑战第21天】Spring Filter 是 Spring 框架中非常重要的一部分,它为请求处理提供了灵活的控制和扩展机制。通过合理配置和使用 Filter,可以实现各种个性化的功能,提升应用的安全性、可靠性和性能。还可以结合具体的代码示例和实际应用案例,进一步深入探讨 Spring Filter 的具体应用和优化技巧,使对它的理解更加全面和深入。
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
101 6
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
409 5
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等