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

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

1,首先引入依赖

<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo</artifactId>
</dependency>

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();
}
package org.jeckxu.magical.core.dubbo.interceptor.constants;

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

    String PROVIDER = "provider";

    String CONSUMER = "consumer";

    String TRACE_ID = "traceId";
}
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);
        }
    }
}
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);
        }
    }
}

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

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

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

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

目录
相关文章
|
1天前
|
监控 安全 Java
Spring cloud原理详解
Spring cloud原理详解
10 0
|
1天前
|
XML Java 数据库连接
Spring框架与Spring Boot的区别和联系
Spring框架与Spring Boot的区别和联系
9 0
|
5天前
|
消息中间件 负载均衡 Java
【Spring Cloud 初探幽】
【Spring Cloud 初探幽】
14 1
|
7天前
|
Java 开发者 微服务
Spring Cloud原理详解
【5月更文挑战第4天】Spring Cloud是Spring生态系统中的微服务框架,包含配置管理、服务发现、断路器、API网关等工具,简化分布式系统开发。核心组件如Eureka(服务发现)、Config Server(配置中心)、Ribbon(负载均衡)、Hystrix(断路器)、Zuul(API网关)等。本文讨论了Spring Cloud的基本概念、核心组件、常见问题及解决策略,并提供代码示例,帮助开发者更好地理解和实践微服务架构。此外,还涵盖了服务通信方式、安全性、性能优化、自动化部署、服务网格和无服务器架构的融合等话题,揭示了微服务架构的未来趋势。
32 6
|
11天前
|
SQL Java 数据库连接
Springboot框架整合Spring JDBC操作数据
JDBC是Java数据库连接API,用于执行SQL并访问多种关系数据库。它包括一系列Java类和接口,用于建立数据库连接、创建数据库操作对象、定义SQL语句、执行操作并处理结果集。直接使用JDBC涉及七个步骤,包括加载驱动、建立连接、创建对象、定义SQL、执行操作、处理结果和关闭资源。Spring Boot的`spring-boot-starter-jdbc`简化了这些步骤,提供了一个在Spring生态中更便捷使用JDBC的封装。集成Spring JDBC需要添加相关依赖,配置数据库连接信息,并通过JdbcTemplate进行数据库操作,如插入、更新、删除和查询。
|
11天前
|
SQL Java 数据库连接
Springboot框架整合Spring Data JPA操作数据
Spring Data JPA是Spring基于ORM和JPA规范封装的框架,简化了数据库操作,提供增删改查等接口,并可通过方法名自动生成查询。集成到Spring Boot需添加相关依赖并配置数据库连接和JPA设置。基础用法包括定义实体类和Repository接口,通过Repository接口可直接进行数据操作。此外,JPA支持关键字查询,如通过`findByAuthor`自动转换为SQL的`WHERE author=?`查询。
|
11天前
|
JSON Java Apache
Spring Cloud Feign 使用Apache的HTTP Client替换Feign原生httpclient
Spring Cloud Feign 使用Apache的HTTP Client替换Feign原生httpclient
|
12天前
|
负载均衡 Java 开发者
Spring Cloud:一文读懂其原理与架构
Spring Cloud 是一套微服务解决方案,它整合了Netflix公司的多个开源框架,简化了分布式系统开发。Spring Cloud 提供了服务注册与发现、配置中心、消息总线、负载均衡、熔断机制等工具,让开发者可以快速地构建一些常见的微服务架构。
|
13天前
|
消息中间件 Java RocketMQ
Spring Cloud RocketMQ:构建可靠消息驱动的微服务架构
【4月更文挑战第28天】消息队列在微服务架构中扮演着至关重要的角色,能够实现服务之间的解耦、异步通信以及数据分发。Spring Cloud RocketMQ作为Apache RocketMQ的Spring Cloud集成,为微服务架构提供了可靠的消息传输机制。
28 1