授权策略设计
- 技术方案选择:采用基于角色的访问控制(RBAC)。RBAC 以角色为中心,将权限与角色关联,用户通过分配不同角色来获得相应权限,这种方式简单直观,易于理解和维护,适合电商系统不同角色明确的场景。
- 具体策略:
- 角色定义:定义普通用户、商家、管理员三种角色。
- 权限分配:
- 普通用户:拥有查看商品详情、下单、查看订单状态权限。
- 商家:除了普通用户查看订单状态权限外,还有管理商品(增删改查)、处理订单(发货等)权限。
- 管理员:拥有对商品、订单的所有管理权限,包括系统配置等高级权限。
在各个微服务中实现授权策略
- 统一认证服务:使用 Spring Security 实现统一认证,用户登录后获取 JWT(JSON Web Token)。JWT 中包含用户角色信息,如
{"role":"customer"}
。
- 微服务配置:
- 在每个微服务的入口处,配置 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) {
// 业务逻辑
}
}
处理跨服务的授权问题
- JWT 传递:在微服务间调用时,将客户端传来的 JWT 传递到下游微服务,确保下游微服务能够验证用户角色。
- 共享权限配置:可以使用配置中心(如 Spring Cloud Config),统一管理各个微服务的权限配置,确保各微服务对角色权限的定义一致。
- 网关层处理:在 API 网关(如 Spring Cloud Gateway)处,对请求进行初步的权限校验。如果请求不符合权限要求,直接返回错误响应,避免不必要的微服务间调用,提高系统性能和安全性。同时,网关可以对 JWT 进行解析,并将角色信息传递给下游微服务,减少微服务重复解析 JWT 的开销。