iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >SpringCloud如何实现微服务数据权限控制
  • 362
分享到

SpringCloud如何实现微服务数据权限控制

2023-06-21 20:06:17 362人浏览 八月长安
摘要

这篇文章将为大家详细讲解有关SpringCloud如何实现微服务数据权限控制,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。举个例子:有一批业务员跟进全国的销售订单。他们被按城市进行划分,一个业务员跟进3个

这篇文章将为大家详细讲解有关SpringCloud如何实现微服务数据权限控制,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

    举个例子:

    有一批业务员跟进全国的销售订单。他们被按城市进行划分,一个业务员跟进3个城市的订单,为了保护公司的业务数据不能被所有人都掌握,故每个业务员只能看到自己负责城市的订单数据。所以从系统来讲每个业务员都有访问销售订单的功能,然后再需要配置每个业务员负责的城市,以此对订单数据进行筛选。

    要实现此功能有很多方法,如果系统中多个地方都需要类似的需求,那我们就可以将其提出来做成一个通用的功能。这里我介绍一个相对简单的解决方案,以供参考。

    一、 整体架构

    SpringCloud如何实现微服务数据权限控制

    数据权限为作一个注解的形式挂在每一个需要数据权限控制的Controller上,由于和具体的程序逻辑有关故有一定的入侵性,且需要数据库配合使用。

    二、 实现流程

    SpringCloud如何实现微服务数据权限控制

    浏览器传带查询权限范围参数访问Controller,如cities

    POST Http://127.0.0.1:8000/order/queryaccept: *    private void setScope(String scope, MethodSignature methodSignature, Object[] args, String authToken) {        // 获取请求范围        Set<String> requestScope = getRequestScope(args, scope, methodSignature.getMethod());        ScopeAuthAdapter adapter = new ScopeAuthAdapter(supplier);        // 已授权范围        Set<String> authorizedScope = adapter.identifyPermissionScope(authToken, requestScope);        // 回写新范围        setRequestScope(args, scope, authorizedScope, methodSignature.getMethod());    }        private void setRequestScope(Object[] args, String scopeName, Collection<String> scopeValues, Method method) {        // 解析 SPEL 表达式        if (scopeName.indexOf(SPEL_FLAG) == 0) {            ParseSPEL.setMethodValue(scopeName, scopeValues, method, args);        }    }}

    此为演示代码省略了过程,主要功能为通过token拿到预先授权的数据范围,再与本次请求的范围做交集,最后回写回原参数。

    过程中用到了较多的SPEL表达式,用于计算表达式结果,具体请参考ParseSPEL文件

    3)权限范围交集计算

    public class ScopeAuthAdapter {    private final AuthQuerySupplier supplier;    public ScopeAuthAdapter(AuthQuerySupplier supplier) {        this.supplier = supplier;    }        public Set<String> identifyPermissionScope(String token, Set<String> requestScope) {        Set<String> authorizeScope = supplier.queryScope(token);        String ALL_SCOPE = "AUTH_ALL";        String USER_ALL = "USER_ALL";        if (authorizeScope == null) {            return null;        }        if (authorizeScope.contains(ALL_SCOPE)) {            // 如果是全开放则返回请求范围            return requestScope;        }        if (requestScope == null) {            return null;        }        if (requestScope.contains(USER_ALL)){            // 所有授权的范围            return authorizeScope;        }        // 移除不同的元素        requestScope.retainAll(authorizeScope);        return requestScope;    }}

    此处为了方便设置,有两个关键字范围

    • AUTH_ALL:预设所有范围,全开放的意思,为数据库预先设置值,请求传什么值都通过

    • USER_ALL:请求所有授权的范围,请求时传此值则会以数据库预设值为准

    4) spring.factories自动导入类配置

    org.springframework.boot.autoconfigure.AutoConfigurationImportSelector=\  fun.barryhome.cloud.annotation.ScopeAuthAdvice

    如果注解功能是单独项目存在,在使用时有可能会存在找不到引入文件的问题,可通过此配置文件自动载入需要初始化的类

    2. 注解使用

    @ScopeAuth(scopes = {"#orderDTO.cities"}, token = "#request.getHeader(\"X-User-Name\")")@PostMapping(value = "/query")public String query(@RequestBody OrderDTO orderDTO, httpservletRequest request) {    return Arrays.toString(orderDTO.getCities());}

    在需要使用数据权限的controller方法上增加@ScopeAuth注解

    scopes = {"#orderDTO.cities"}:表示取输入参数orderDTO的cities值,这里是表达式必须加#

    实际开发过程中,需要将orderDTO.getCities()带入后续逻辑中,在DAO层将此拼装在sql中,以实现数据过滤功能

    3. 实现AuthStoreSupplier

    AuthStoreSupplier接口为数据权限的存储接口,与AuthQuerySupplier配合使用,可按实际情况实现

    此接口为非必要接口,可由数据库或Redis存储(推荐),一般在登录的同时保存在Redis

    4. 实现AuthQuerySupplier

    AuthQuerySupplier接口为数据权限查询接口,可按存储方法进行查询,推荐使用Redis

    @Componentpublic class RedisAuthQuerySupplier implements AuthQuerySupplier {    @Autowired    private RedisTemplate<String, String> redisTemplate;        @Override    public Set<String> queryScope(String key) {        String AUTH_USER_KEY = "auth:logic:user:%s";        String redisKey = String.fORMat(AUTH_USER_KEY, key);        List<String> range = redisTemplate.opsForList().range(redisKey, 0, -1);        if (range != null) {            return new HashSet<>(range);        } else {            return null;        }    }}

    分布式结构里,也可将此实现提出到权限模块,采用远程调用方式,进一步解耦

    5. 开启数据权限

    @EnableScopeAuth@EnableDiscoveryClient@SpringBootApplicationpublic class OrderApplication {    public static void main(String[] args) {        SpringApplication.run(OrderApplication.class, args);    }}

    关于“SprinGCloud如何实现微服务数据权限控制”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

    --结束END--

    本文标题: SpringCloud如何实现微服务数据权限控制

    本文链接: https://www.lsjlt.com/news/300460.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • SpringCloud如何实现微服务数据权限控制
      这篇文章将为大家详细讲解有关SpringCloud如何实现微服务数据权限控制,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。举个例子:有一批业务员跟进全国的销售订单。他们被按城市进行划分,一个业务员跟进3个...
      99+
      2023-06-21
    • SpringCloud 微服务数据权限控制的实现
      目录一、 整体架构二、 实现流程三、 实现步骤1. 注解实现2. 注解使用3. 实现AuthStoreSupplier4. 实现AuthQuerySupplier5. 开启数据权限四...
      99+
      2022-11-12
    • vue-router如何实现权限控制
      这篇文章主要讲解了“vue-router如何实现权限控制”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue-router如何实现权限控制”吧!在vue-router控制前端权限是常见需求:...
      99+
      2023-07-04
    • MyBatis Plus 拦截器实现数据权限控制
      一、介绍 上篇文章介绍的MyBatis Plus 插件实际上就是用拦截器实现的,MyBatis Plus拦截器对MyBatis的拦截器进行了包装处理,操作起来更加方便 二、自定义拦截器 2.1、InnerInterceptor MyBati...
      99+
      2023-08-20
      mybatis java mysql
    • 如何在MongoDB中实现数据的权限控制功能
      如何在MongoDB中实现数据的权限控制功能在现代的数据应用中,很多时候需要实现对数据的权限控制,以确保只有授权的用户能够访问和操作特定的数据。MongoDB作为一种流行的NoSQL数据库,也提供了一些机制来实现数据的权限控制。本文将介绍如...
      99+
      2023-10-22
      MongoDB权限控制
    • 如何控制大数据报表的数据权限
      如何控制大数据报表的数据权限,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。控制报表数据访问权限,是让不同的人访问同一张报表的时候所看到的数据是不同的或者说只能看...
      99+
      2023-06-03
    • CentOS下如何实现ACL权限控制
      这篇文章主要介绍“CentOS下如何实现ACL权限控制”,在日常操作中,相信很多人在CentOS下如何实现ACL权限控制问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”CentOS下如何实现ACL权限控制”的疑...
      99+
      2023-06-10
    • 如何在PHP中实现权限控制
      随着互联网的不断发展,越来越多的网站和应用程序依赖于PHP语言进行开发。然而,如何在PHP中实现权限控制仍然是一个重要的挑战。在本文中,我们将介绍一些常用的方法和技巧,以帮助您在PHP中实现有效的权限控制。定义用户角色和权限在开始编写代码之...
      99+
      2023-05-20
      PHP 实现 权限控制
    • Oracle如何实现用户权限控制
      这篇文章主要为大家展示了“Oracle如何实现用户权限控制”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Oracle如何实现用户权限控制”这篇文章吧。1、用户O...
      99+
      2022-10-19
    • vue如何实现路由权限控制
      这篇“vue如何实现路由权限控制”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue如何实现路由权限控制”文章吧。在Vue中...
      99+
      2023-07-06
    • SpringBoot如何整合Springsecurity实现数据库登录及权限控制
      目录第一步第二步是封装一个自定义的类第三步, 我们需要判断密码啦总结我们今天使用SpringBoot来整合SpringSecurity,来吧,不多BB 首先呢,是一个SpringBo...
      99+
      2022-11-12
    • MyBatis-Plus 使用拦截器实现数据权限控制
      前言背景 平时开发中遇到根据当前用户的角色,只能查看数据权限范围的数据需求。列表实现方案有两种,一是在开发初期就做好判断赛选,但如果这个需求是中途加的,或不希望每个接口都加一遍,就可以方案二加拦截器的...
      99+
      2023-09-07
      mybatis java
    • Openresty如何实现的网关权限控制
      小编给大家分享一下Openresty如何实现的网关权限控制,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!技术栈本小节采用了以下的技术栈:Openresty(lua...
      99+
      2023-06-19
    • 怎么使用MyBatisPlus拦截器实现数据权限控制
      这篇文章主要介绍“怎么使用MyBatisPlus拦截器实现数据权限控制”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用MyBatisPlus拦截器实现数据权限控制”文章能帮助大家解决问题。前言...
      99+
      2023-07-05
    • MyBatis-Plus拦截器实现数据权限控制的示例
      目录前言背景上代码(基础版)进阶版前言背景 平时开发中遇到根据当前用户的角色,只能查看数据权限范围的数据需求。列表实现方案有两种,一是在开发初期就做好判断赛选,但如果这个需求是中途加...
      99+
      2023-02-24
      MyBatis-Plus 权限控制 MyBatis-Plus 拦截器权限控制
    • 在Angular项目中如何实现权限控制
      这篇文章主要介绍“在Angular项目中如何实现权限控制”,在日常操作中,相信很多人在在Angular项目中如何实现权限控制问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”在A...
      99+
      2022-10-19
    • 数据库中如何创建ID和权限控制
      这篇文章将为大家详细讲解有关数据库中如何创建ID和权限控制,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 USE [master]GOCRE...
      99+
      2022-10-18
    • 如何使用vue-router实现动态权限控制
      本篇内容介绍了“如何使用vue-router实现动态权限控制”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!使用vue开发带权限管理系统,尤其...
      99+
      2023-07-04
    • SpringBoot怎么整合Springsecurity实现数据库登录及权限控制
      这篇文章主要为大家展示了“SpringBoot怎么整合Springsecurity实现数据库登录及权限控制”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SpringBoot怎么整合Springs...
      99+
      2023-06-22
    • 如何实现微服务鉴权
      今天小编给大家分享一下如何实现微服务鉴权的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 认证与授权首先小伙伴们知道,无论...
      99+
      2023-07-05
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作