权限验证阶段说明.md
3.87 KB
权限验证阶段说明
阶段概述
权限验证阶段是网关调度的安全屏障,负责验证用户是否有访问特定资源的权限。通过IPrivilegeSMO接口实现多层次的权限校验机制,确保系统安全性。
核心组件
- IPrivilegeSMO: 权限校验接口
- BootPrivilegeSMOImpl: 权限校验实现类
- IPageData: 页面数据对象
- RestTemplate: REST调用模板
处理流程
1. 获取权限数据
- 通过AOP拦截器获取IPageData对象
- IPageData包含用户信息、token等认证数据
- 从请求上下文中获取权限验证所需信息
2. 权限校验调用
// 调用权限校验服务
privilegeSMOImpl.hasPrivilege(restTemplate, pd, "/app/" + service);
3. 权限验证逻辑
- 验证用户与商户的关系权限
- 基于菜单权限配置进行访问控制
- 校验用户是否有访问该接口的权限
代码示例
权限校验接口定义
public interface IPrivilegeSMO {
void hasPrivilege(RestTemplate restTemplate, IPageData pd, String resource);
}
权限校验实现类
@Component
public class BootPrivilegeSMOImpl extends DefaultAbstractComponentSMO implements IPrivilegeSMO {
@Override
public void hasPrivilege(RestTemplate restTemplate, IPageData pd, String resource) {
// 调用父类的hasPrivilege方法进行权限验证
super.hasPrivilege(restTemplate, pd, resource);
}
}
在网关中的调用
// 在AppController中调用权限校验
@RequestMapping(path = "/{service:.+}", method = RequestMethod.POST)
public ResponseEntity<String> servicePost(@PathVariable String service,
@RequestBody String postInfo,
HttpServletRequest request) {
// 初始化头信息...
Map<String, String> headers = new HashMap<>();
this.getRequestInfo(request, headers);
// 权限验证阶段
IPageData pd = (IPageData) request.getAttribute(CommonConstant.CONTEXT_PAGE_DATA);
privilegeSMOImpl.hasPrivilege(restTemplate, pd, "/app/" + service);
// 验证通过后进入服务分发阶段
ResponseEntity<String> responseEntity = apiSMOImpl.doApi(postInfo, headers, request);
return responseEntity;
}
关键配置
权限相关常量
public final static String CONTEXT_PAGE_DATA = "pd"; // 页面数据上下文
public final static String COOKIE_AUTH_TOKEN = "_java110_token_"; // 认证token
资源路径格式
- 权限验证的资源路径格式:
/app/{service} - 与服务编码保持一致,便于权限管理
权限校验机制
1. 用户权限验证
- 验证用户身份和角色
- 检查用户是否属于当前商户
- 验证token有效性
2. 资源权限验证
- 基于RBAC(基于角色的访问控制)模型
- 验证用户是否有访问特定资源的权限
- 检查菜单权限配置
3. 业务权限验证
- 验证用户在当前业务上下文中的权限
- 检查数据权限范围
异常处理
权限异常类型
// 权限校验失败时抛出异常
if (!hasPermission) {
throw new NoAuthorityException("用户没有访问权限");
}
统一异常处理
try {
privilegeSMOImpl.hasPrivilege(restTemplate, pd, "/app/" + service);
} catch (NoAuthorityException e) {
logger.error("权限验证失败", e);
return ResultVo.error("权限不足", HttpStatus.FORBIDDEN);
}
技术要点
- AOP拦截机制: 通过AOP自动获取IPageData对象
- 继承复用: BootPrivilegeSMOImpl继承DefaultAbstractComponentSMO复用权限逻辑
- 统一资源标识: 使用标准化的资源路径格式
- 多层次验证: 用户权限、资源权限、业务权限的多层次验证
安全特性
- 防止未授权访问
- 基于角色的细粒度权限控制
- 完整的权限审计日志
- 支持动态权限配置