Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >微服务架构 | 如何让接口权限继续继承下去?

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

作者头像
码农架构
发布于 2021-12-27 09:18:44
发布于 2021-12-27 09:18:44
72300
代码可运行
举报
文章被收录于专栏:码农架构码农架构
运行总次数:0
代码可运行
导读:在访问系统某个或者某类接口后进行一系列权限校验,但在后续接口中我们想让访问权限一直授权下去改如何处理呢?总结本篇文章希望对从事相关工作的同学能够有所帮助或者启发。

权限继承意味着网站集中某个元素的权限设置将传递给该元素的子元素。这样,网站会从网站集的顶级 ("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也行,但是要追加失效属性(过期时间)
  • 授权接口列表:颁发访问授权码时候需要明确,授权码能访问哪些指定接口,而不能对所有接口全部开放。
  • 模块标识:颁发访问授权码时候最好明确是那个模块的业务,如何授权接口中包含模块标识二级路径这里就可以忽略了。
  • 业务标识:这里主要是针对特定场景下的业务标识。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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);
      }
      
      ....
}

三、解析授权码

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 解析授权码
 *
 * @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那就是常驻贵宾了。先前在针对服务认证的时候有也有提及到过。

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

▐ 官方注释上解释

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

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

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Springboot之Security前后端分离登录
Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架。它是用于保护基于Spring的应用程序的实际标准。 Spring Security是一个框架,致力于为Java应用程序提供身份验证和授权。与所有Spring项目一样,Spring Security的真正强大之处在于可以轻松扩展以满足自定义要求 官方网站:https://spring.io/projects/spring-security#learn
海加尔金鹰
2020/09/16
9.5K3
认证鉴权与API权限控制在微服务架构中的设计与实现(四)
引言: 本文系《认证鉴权与API权限控制在微服务架构中的设计与实现》系列的完结篇,前面三篇已经将认证鉴权与API权限控制的流程和主要细节讲解完。本文比较长,对这个系列进行收尾,主要内容包括对授权和鉴权流程之外的endpoint以及 SpringSecurity过滤器部分踩坑的经历。欢迎阅读本系列文章。 1. 前文回顾 首先还是照例对前文进行回顾。在第一篇 认证鉴权与API权限控制在微服务架构中的设计与实现(一)介绍了该项目的背景以及技术调研与最后选型。第二篇认证鉴权与API权限控制在微服务架构中的设计与实现
aoho求索
2018/04/03
1.8K0
认证鉴权与API权限控制在微服务架构中的设计与实现(四)
10分钟搞定OAuth2.0授权服务
现在授权模式基本都是用OAuth2.0,什么OAuth2.0呢?这个有兴趣的同学可看阮大神的文章,今天主要给大家介绍一下OAuth 2.0的一种实现。
林老师带你学编程
2020/09/11
7150
Spring boot+Spring security+JJWT 实现restful风格的权限验证
https://github.com/MarkGao11520/spring-boot-security-restful
Meet相识
2018/09/12
3.7K2
认证鉴权与API权限控制在微服务架构中的设计与实现(三)
引言: 本文系《认证鉴权与API权限控制在微服务架构中的设计与实现》系列的第三篇,本文重点讲解token以及API级别的鉴权。本文对涉及到的大部分代码进行了分析,欢迎订阅本系列文章。 1. 前文回顾 在开始讲解这一篇文章之前,先对之前两篇文章进行回忆下。在第一篇 《认证鉴权与API权限控制在微服务架构中的设计与实现(一)》介绍了该项目的背景以及技术调研与最后选型。第二篇《认证鉴权与API权限控制在微服务架构中的设计与实现(二)》画出了简要的登录和校验的流程图,并重点讲解了用户身份的认证与token发放的具体
aoho求索
2018/04/03
2.6K0
认证鉴权与API权限控制在微服务架构中的设计与实现(三)
认证鉴权与API权限控制在微服务架构中的设计与实现(二)
引言: 本文系《认证鉴权与API权限控制在微服务架构中的设计与实现》系列的第二篇,本文重点讲解用户身份的认证与token发放的具体实现。本文篇幅较长,对涉及到的大部分代码进行了分析,可收藏于闲暇时间阅读,欢迎订阅本系列文章。 1. 系统概览 在上一篇 《认证鉴权与API权限控制在微服务架构中的设计与实现(一)》介绍了该项目的背景以及技术调研与最后选型,并且对于最终实现的endpoint执行结果进行展示。对系统架构虽然有提到,但是并未列出详细流程图。在笔者的应用场景中,Auth系统与网关进行结合。在网关出配置
aoho求索
2018/04/03
1.7K0
认证鉴权与API权限控制在微服务架构中的设计与实现(二)
Spring认证-Spring 安全架构专题教程
本指南是 Spring Security 的入门,提供对框架设计和基本构建块的深入了解。我们只涵盖应用程序安全的基础知识。但是,通过这样做,我们可以消除使用 Spring Security 的开发人员所遇到的一些困惑。为此,我们通过使用过滤器,更一般地说,通过使用方法注释来查看在 Web 应用程序中应用安全性的方式。当您需要对安全应用程序的工作原理、如何对其进行自定义,或者需要了解如何考虑应用程序安全性时,请使用本指南。
IT胶囊
2021/09/02
7490
Shiro框架02权限认证+MD5加盐加密+散列1024+Hex/Base64(源码)
                           用户与角色                                              角色与权限
天蝎座的程序媛
2022/11/18
6760
Shiro框架02权限认证+MD5加盐加密+散列1024+Hex/Base64(源码)
SpringBoot3安全管理
SpringSecurity组件可以为服务提供安全管理的能力,比如身份验证、授权和针对常见攻击的保护,是保护基于spring应用程序的事实上的标准;
知了一笑
2023/09/01
2480
SpringBoot3安全管理
SpringBoot3整合SpringSecurity,实现自定义接口权限过滤
在实现自定义接口权限过滤之前,首先要导入依赖,首先是 SpringBoot 父依赖。
Designer 小郑
2023/08/01
2.9K1
SpringBoot3整合SpringSecurity,实现自定义接口权限过滤
SpringSecurity 实现几种常见的登录方式
SpringSecurity 要求配置类继承 WebSecurityConfigurerAdapter,并重写其中的 configure 方法。我们先进行基本的配置:
1270778
2024/02/05
8060
SpringBoot整合Security安全框架、控制权限
Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。
宁在春
2022/10/31
9120
SpringBoot整合Security安全框架、控制权限
SpringCloud微服务构建浅析
Spring Cloud 作为Java 语言的微服务框架,它依赖于Spring Boot,有快速开发、持续交付和容易部署等特点。Spring Cloud 的组件非常多,涉及微服务的方方面面,井在开源社区Spring 和Netflix 、Pivotal 两大公司的推动下越来越完善。
程序大视界
2020/07/21
6750
SpringCloud微服务构建浅析
SpringSecurity学习
其核心就是一组过滤器链,项目启动后将会自动配置。最核心的就是 Basic Authentication Filter 用来认证用户的身份,一个在spring security中一种过滤器处理一种认证方式
云边小卖部
2022/12/02
6910
微服务网关与用户身份识别,JWT+Spring Security进行网关安全认证
JWT和Spring Security相结合进行系统安全认证是目前使用比较多的一种安全认证组合。疯狂创客圈crazy-springcloud微服务开发脚手架使用JWT身份令牌结合Spring Security的安全认证机制完成用户请求的安全权限认证。整个用户认证的过程大致如下:
愿天堂没有BUG
2022/10/28
1.9K0
微服务网关与用户身份识别,JWT+Spring Security进行网关安全认证
Spring Boot 如何保证接口安全?有哪些常用的接口安全技术?
在当今互联网时代,保障接口安全已经成为了每个企业必须面对的重要问题。作为一个快速开发框架,Spring Boot 同样需要保障其接口的安全性。本文将详细介绍 Spring Boot 如何保证接口安全,以及常用的接口安全技术。
网络技术联盟站
2023/06/03
1.1K0
微服务权限
通过认证服务(oauth2-auth)进行统一认证,然后通过网关(oauth2-gateway)来统一校验认证和鉴权。采用Nacos作为注册中心,Gateway作为网关,使用nimbus-
花落花相惜
2021/12/07
7140
微服务架构中整合网关、权限服务
前言:之前的文章有讲过微服务的权限系列和网关实现,都是孤立存在,本文将整合后端服务与网关、权限系统。安全权限部分的实现还讲解了基于前置验证的方式实现,但是由于与业务联系比较紧密,没有具体的示例。业务权限与业务联系非常密切,本次的整合项目将会把这部分的操作权限校验实现基于具体的业务服务。 1. 前文回顾与整合设计 在认证鉴权与API权限控制在微服务架构中的设计与实现系列文章中,讲解了在微服务架构中Auth系统的授权认证和鉴权。在微服务网关中,讲解了基于netflix-zuul组件实现的微服务网关。下面我们看一
aoho求索
2018/04/03
2.8K0
微服务架构中整合网关、权限服务
Redis在Window服务下的安装
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/pyycsd/article/details/80969693
用户1212940
2019/06/20
1.1K0
Redis在Window服务下的安装
Spring Boot 使用 JWT 进行身份和权限验证
上周写了一个 适合初学者入门 Spring Security With JWT 的 Demo,这篇文章主要是对代码中涉及到的比较重要的知识点的说明。
Guide哥
2020/05/08
3.6K0
推荐阅读
相关推荐
Springboot之Security前后端分离登录
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验