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组件可以实现动态配置。

目录
相关文章
|
18天前
|
XML Java 应用服务中间件
Spring Boot 两种部署到服务器的方式
本文介绍了Spring Boot项目的两种部署方式:jar包和war包。Jar包方式使用内置Tomcat,只需配置JDK 1.8及以上环境,通过`nohup java -jar`命令后台运行,并开放服务器端口即可访问。War包则需将项目打包后放入外部Tomcat的webapps目录,修改启动类继承`SpringBootServletInitializer`并调整pom.xml中的打包类型为war,最后启动Tomcat访问应用。两者各有优劣,jar包更简单便捷,而war包适合传统部署场景。需要注意的是,war包部署时,内置Tomcat的端口配置不会生效。
140 17
Spring Boot 两种部署到服务器的方式
|
14天前
|
Dubbo 应用服务中间件 API
使用 Apifox、Postman 测试 Dubbo 服务,Apache Dubbo OpenAPI 即将发布
Apache Dubbo 3.3.3(即将发布)实现了与 OpenAPI 的深度集成,通过与 OpenAPI 的深度集成,用户能够体验到从文档生成到接口调试、测试和优化的全流程自动化支持。不论是减少手动工作量、提升开发效率,还是支持多语言和多环境,Dubbo 3.3.3 都展现了其对开发者体验的极大关注。结合强大的 Mock 数据生成和自动化测试能力,这一版本为开发者提供了极具竞争力的服务治理解决方案。如果你正在寻找高效、易用的微服务框架,Dubbo 3.3.3 将是你不容错过的选择。
|
13天前
|
监控 Java 应用服务中间件
SpringBoot是如何简化Spring开发的,以及SpringBoot的特性以及源码分析
Spring Boot 通过简化配置、自动配置和嵌入式服务器等特性,大大简化了 Spring 应用的开发过程。它通过提供一系列 `starter` 依赖和开箱即用的默认配置,使开发者能够更专注于业务逻辑而非繁琐的配置。Spring Boot 的自动配置机制和强大的 Actuator 功能进一步提升了开发效率和应用的可维护性。通过对其源码的分析,可以更深入地理解其内部工作机制,从而更好地利用其特性进行开发。
32 6
|
26天前
|
缓存 安全 Java
Spring Boot 3 集成 Spring Security + JWT
本文详细介绍了如何使用Spring Boot 3和Spring Security集成JWT,实现前后端分离的安全认证概述了从入门到引入数据库,再到使用JWT的完整流程。列举了项目中用到的关键依赖,如MyBatis-Plus、Hutool等。简要提及了系统配置表、部门表、字典表等表结构。使用Hutool-jwt工具类进行JWT校验。配置忽略路径、禁用CSRF、添加JWT校验过滤器等。实现登录接口,返回token等信息。
241 12
|
1月前
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
74 8
|
2月前
|
缓存 前端开发 Java
【Spring】——SpringBoot项目创建
SpringBoot项目创建,SpringBootApplication启动类,target文件,web服务器,tomcat,访问服务器
|
3月前
|
监控 Java 数据库连接
详解Spring Batch:在Spring Boot中实现高效批处理
详解Spring Batch:在Spring Boot中实现高效批处理
430 12
|
3月前
|
安全 Java 测试技术
详解Spring Profiles:在Spring Boot中实现环境配置管理
详解Spring Profiles:在Spring Boot中实现环境配置管理
142 10
|
2月前
|
消息中间件 监控 Java
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
47 6
|
2月前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
190 5