MST

星途 面试题库

面试题:微服务架构Spring Cloud分布式系统的授权策略设计

假设你正在负责一个Spring Cloud微服务架构的电商系统,不同角色(如普通用户、商家、管理员)对商品、订单等资源有不同的访问权限。请设计一套授权策略,包括使用的技术方案(如基于角色的访问控制RBAC、基于属性的访问控制ABAC等),并说明如何在各个微服务中实现该授权策略以及处理跨服务的授权问题。
31.0万 热度难度
后端开发微服务架构

知识考点

AI 面试

面试题答案

一键面试

授权策略设计

  1. 技术方案选择:采用基于角色的访问控制(RBAC)。RBAC 以角色为中心,将权限与角色关联,用户通过分配不同角色来获得相应权限,这种方式简单直观,易于理解和维护,适合电商系统不同角色明确的场景。
  2. 具体策略
    • 角色定义:定义普通用户、商家、管理员三种角色。
    • 权限分配
      • 普通用户:拥有查看商品详情、下单、查看订单状态权限。
      • 商家:除了普通用户查看订单状态权限外,还有管理商品(增删改查)、处理订单(发货等)权限。
      • 管理员:拥有对商品、订单的所有管理权限,包括系统配置等高级权限。

在各个微服务中实现授权策略

  1. 统一认证服务:使用 Spring Security 实现统一认证,用户登录后获取 JWT(JSON Web Token)。JWT 中包含用户角色信息,如 {"role":"customer"}
  2. 微服务配置
    • 在每个微服务的入口处,配置 Spring Security 过滤器链,验证 JWT 的有效性。
    • 基于角色进行权限控制,例如在商品微服务中,对于获取商品详情接口,允许所有角色访问;而商品管理接口,只允许商家和管理员角色访问。可以通过在接口方法上使用 @PreAuthorize 注解实现,示例代码如下:
@RestController
@RequestMapping("/products")
public class ProductController {

    @GetMapping("/{productId}")
    @PreAuthorize("hasAnyRole('customer','merchant','admin')")
    public ResponseEntity<Product> getProductById(@PathVariable Long productId) {
        // 业务逻辑
    }

    @PostMapping
    @PreAuthorize("hasAnyRole('merchant','admin')")
    public ResponseEntity<Product> createProduct(@RequestBody Product product) {
        // 业务逻辑
    }
}

处理跨服务的授权问题

  1. JWT 传递:在微服务间调用时,将客户端传来的 JWT 传递到下游微服务,确保下游微服务能够验证用户角色。
  2. 共享权限配置:可以使用配置中心(如 Spring Cloud Config),统一管理各个微服务的权限配置,确保各微服务对角色权限的定义一致。
  3. 网关层处理:在 API 网关(如 Spring Cloud Gateway)处,对请求进行初步的权限校验。如果请求不符合权限要求,直接返回错误响应,避免不必要的微服务间调用,提高系统性能和安全性。同时,网关可以对 JWT 进行解析,并将角色信息传递给下游微服务,减少微服务重复解析 JWT 的开销。