微服务架构 | 如何让接口权限继续继承下去?

2024-03-01 12:10

本文主要是介绍微服务架构 | 如何让接口权限继续继承下去?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

导读:在访问系统某个或者某类接口后进行一系列权限校验,但在后续接口中我们想让访问权限一直授权下去改如何处理呢?总结本篇文章希望对从事相关工作的同学能够有所帮助或者启发。

权限继承意味着网站集中某个元素的权限设置将传递给该元素的子元素。这样,网站会从网站集的顶级 ("root") 网站继承权限,库继承自包含库的网站,等等。权限继承使您能够一次进行权限分配,并且拥有该权限应用于继承权限的所有网站、列表、库、文件夹和项目。此行为可降低网站集管理员和网站所有者在安全管理上所花的复杂性和时间。

一、背景


在一次性能优化中发现,检查堆栈质摘要信息后,发现权限校验接口耗时高达 1.5s 以上还不涉及任何实例数据,但是对实例数据交叉查询较为频繁。针对这种场景需要对数据查询的接口做性能优化。

前后检查完后发现实例查询数据最大的瓶颈就是权限校验接口,其次就是实例查询接口。

如下面场景

 

在经过 1~6 请求并且完成闭环之后,如果我们需要继续通过⑥接口返回的实例的某些参数继续请求。

此时我们一帮两种解决思路

  • 在原有接口中继续优化参数,将需要第二次请求的入参和返回参数依次追加到同一个接口中

  • 新开发一个接口继续走权限校验和第一个接口实现步骤一样。

但这两种方案都合理么?

二、生成授权码


原理其实很简单,如我们单点登录认证中心颁发认证码授权访问各个系统一样的到底。怎么实现呢?

 ▐ 授权码生成规则

本文权限校验基于 Spring-security 进行改造拓展

建议没有阅读过的朋友有机会可阅读下源码

https://spring.io/projects/spring-security#overview

对于 AuthToken 的定义我们一般定义

  • principal    验证主体

被验证主体的身份。在带有用户名和密码的身份验证请求的情况下,这将是用户名。调用者应为身份验证请求填充主体。

AuthenticationManager 实现通常会返回一个包含更丰富信息的身份验证作为应用程序使用的主体。许多身份验证提供程序将创建一个 UserDetails 对象作为主体

  • credentials  验证凭证

证明主体正确的凭据。这通常是一个密码,但可以是与 AuthenticationManager 相关的任何内容。呼叫者应填充凭据。

  • details        回话详情

存储有关身份验证请求的其他详细信息。这些可能是 IP 地址、证书序列号等。

  • authenticated  是否已认证

用于指示 AbstractSecurityInterceptor 是否应向 AuthenticationManager 提供身份验证令牌。通常, AuthenticationManager (或更常见的是,其 AuthenticationProvider 之一)将在成功身份验证后返回一个不可变的身份验证令牌,在这种情况下,该令牌可以安全地返回 true 给此方法。返回 true 将提高性能,因为不再需要为每个请求调用 AuthenticationManager 。

出于安全原因,这个接口的实现应该非常小心地从这个方法返回 true ,除非它们是不可变的,或者有某种方法确保属性自最初创建以来没有被更改


对内容进行加密,先前提到过几种常用的加密方式,对内容进行暴力加密解密也行。

  • 微服务架构 | 微服务有哪些常用的加密方式 (一)

  • 微服务架构 | 数据加密有哪些常用的加密方式(二)

但是这里要强调的是加密内容以及哪些必要参数

  • 用户 SessionID:SessionID 是必须的,颁发授权码授权的用户对象是谁;当然这里用 UserID 也行,但是要追加失效属性(过期时间)

  • 授权接口列表:颁发访问授权码时候需要明确,授权码能访问哪些指定接口,而不能对所有接口全部开放。

  • 模块标识:颁发访问授权码时候最好明确是那个模块的业务,如何授权接口中包含模块标识二级路径这里就可以忽略了。

  • 业务标识:这里主要是针对特定场景下的业务标识。

 

public class MechanismAuthTokenUtil {private static final byte[] key = new byte[]{-122, 47, -49, -55, -14, -99, -51, -69, -2, 124, -80, 45, 27, 76, -17, 92};private static AES aes;private static AES getAes() {if (aes == null) {aes = SecureUtil.aes(key);}return aes;}private static final String separator = ";";private static final String entitySeparator = "#";private static final String authSeparator = "\\|";private static final String authDelimiter = "|";..../*** 生成授权码*/public static String encode(String moduleKey, String primaryKey, String auth) {return encode(SessionUtil.getSessionId(), moduleKey, primaryKey, auth);}/*** 生成授权码*/public static String encode(String sessionId, String moduleKey, String primaryKey, String auth) {return getAes().encryptBase64(sessionId + separator+ moduleKey + entitySeparator+ primaryKey + separator+ auth);}....
}

三、解析授权码


解析授权码就是将密文解密的过程,一帮通过对称加密或者其他方式进行处理

/*** 解析授权码** @param token 授权码* @return MechanismAuth*/
public static MechanismAuth decode(String token) {try {return getMechanismAuth(token, getAes().decryptStr(token));} catch (Exception e) {log.error("token(" + token + ")AES解密失败", e);return null;}
}private static MechanismAuth getMechanismAuth(String token, String decryptStr) {try {final String[] split = decryptStr.split(separator);final String[] entitySplit = split[1].split(entitySeparator);return new MechanismAuth(split[0], entitySplit[0], entitySplit[1], split[2]);} catch (Exception e) {log.error("token(" + token + ")格式不正确", e);return null;}
}

得到 AuthToken 定义内容

  • principal    验证主体

  • credentials  验证凭证

  • details        回话详情

  • authenticated  是否已认证

得到 AuthToken 在确定授权信息基本定义、明文组成规则、加密方式、解密方式后。还有知道系统在什么时候拦截较为合适。

四、授权拦截


对于 Web 服务拦截,如果基于 Spring-security 进行改造拓展,OncePerRequestFilter 那就是常驻贵宾了。先前在针对服务认证的时候有也有提及到过。

  • Spring Cloud中如何保证各个微服务之间调用的安全性?

就不做过多说明实现拦截方法

 

▐ 官方注释上解释

OncePerRequestFilter 过滤器基类,旨在保证在任何 servlet 容器上每个请求分派一次执行。它提供了一个带有 HttpServletRequest 和 HttpServletResponse 参数的 doFilterInternal 方法。

从 Servlet 3.0 开始,过滤器可以作为发生在单独线程中的 REQUEST 或 ASYNC 调度的一部分被调用。可以在 web.xml 中配置过滤器是否应该参与异步调度。但是,在某些情况下,servlet 容器会采用不同的默认配置。因此,子类可以覆盖方法 shouldNotFilterAsyncDispatch()以静态声明它们是否确实应该在两种类型的调度期间被调用一次,以便提供线程初始化、日志记录、安全性等。这种机制补充而不是取代在 web.xml 使用调度程序类型配置过滤器的需要。

子类可以使用 isAsyncDispatch(HttpServletRequest)来确定过滤器何时作为异步调度的一部分被调用,并使用 isAsyncStarted(HttpServletRequest)来确定请求何时处于异步模式,因此当前调度不会是最后一个对于给定的请求。

另一种也出现在它自己的线程中的调度类型是 ERROR 。如果子类希望静态声明是否应该在错误调度期间调用一次,它们可以覆盖 shouldNotFilterErrorDispatch() 。

getAlreadyFilteredAttributeName 方法确定如何识别请求已被过滤。默认实现基于具体过滤器实例的配置名称

这篇关于微服务架构 | 如何让接口权限继续继承下去?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/762408

相关文章

windos server2022的配置故障转移服务的图文教程

《windosserver2022的配置故障转移服务的图文教程》本文主要介绍了windosserver2022的配置故障转移服务的图文教程,以确保服务和应用程序的连续性和可用性,文中通过图文介绍的非... 目录准备环境:步骤故障转移群集是 Windows Server 2022 中提供的一种功能,用于在多个

解决systemctl reload nginx重启Nginx服务报错:Job for nginx.service invalid问题

《解决systemctlreloadnginx重启Nginx服务报错:Jobfornginx.serviceinvalid问题》文章描述了通过`systemctlstatusnginx.se... 目录systemctl reload nginx重启Nginx服务报错:Job for nginx.javas

Java后端接口中提取请求头中的Cookie和Token的方法

《Java后端接口中提取请求头中的Cookie和Token的方法》在现代Web开发中,HTTP请求头(Header)是客户端与服务器之间传递信息的重要方式之一,本文将详细介绍如何在Java后端(以Sp... 目录引言1. 背景1.1 什么是 HTTP 请求头?1.2 为什么需要提取请求头?2. 使用 Spr

Linux中chmod权限设置方式

《Linux中chmod权限设置方式》本文介绍了Linux系统中文件和目录权限的设置方法,包括chmod、chown和chgrp命令的使用,以及权限模式和符号模式的详细说明,通过这些命令,用户可以灵活... 目录设置基本权限命令:chmod1、权限介绍2、chmod命令常见用法和示例3、文件权限详解4、ch

Mybatis拦截器如何实现数据权限过滤

《Mybatis拦截器如何实现数据权限过滤》本文介绍了MyBatis拦截器的使用,通过实现Interceptor接口对SQL进行处理,实现数据权限过滤功能,通过在本地线程变量中存储数据权限相关信息,并... 目录背景基础知识MyBATis 拦截器介绍代码实战总结背景现在的项目负责人去年年底离职,导致前期规

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

mybatis的整体架构

mybatis的整体架构分为三层: 1.基础支持层 该层包括:数据源模块、事务管理模块、缓存模块、Binding模块、反射模块、类型转换模块、日志模块、资源加载模块、解析器模块 2.核心处理层 该层包括:配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件 3.接口层 该层包括:SqlSession 基础支持层 该层保护mybatis的基础模块,它们为核心处理层提供了良好的支撑。

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。