当前位置: 首页 > news >正文

SpringBoot 地铁 ISCS 实战第十六篇:RBAC权限管控实战|多租户隔离、角色菜单权限、车站数据权限分级落地

标签:#工控开发 #地铁ISCS #SpringSecurity #RBAC权限 #轨道交通综合监控
摘要:地铁ISCS综合监控系统区分OCC调度中心运维员、车站本地运维、系统管理员、第三方运维多岗位人员,同时多条线路、各车站数据需物理权限隔离,禁止跨车站、跨线路越权查看设备、告警、孪生大屏数据。本文承接前十五篇ISCS全套业务架构,基于SpringSecurity+自定义RBAC五表权限模型,搭建工控专属权限体系;实现用户-角色-菜单按钮绑定、功能权限拦截、线路+车站数据租户隔离、大屏页面权限、接口权限双重校验;区分超级管理员、调度管理员、车站运维、只读访客四大岗位角色,适配地铁运维人员岗位职责;贴合工控内网离线部署、无第三方权限组件、高安全合规要求,对接孪生大屏、告警服务、时序查询、联动引擎全部接口,解决人员越权、跨站数据泄露、功能按钮违规操作、岗位权责混乱项目验收痛点。

一、前言

前十五篇已完成GoA4全自动地铁ISCS端到端业务闭环:OPCUA边缘采集、Kafka五大独立消费组、场景联动引擎、数字孪生大屏、TDengine时序归档、三级告警服务全部落地,业务功能、数据存储、可视化、告警管控全部满足现场运行需求。
项目交付业主、安监验收、多班组运维上线后,权限管控缺失暴露出轨交工控系统致命合规问题,不符合地铁运维安全管理规范:
1、所有账号权限一致,车站运维人员可查看全线OCC调度数据、修改自动化联动策略,存在行车安全风险;
2、无数据租户隔离,A车站人员可查看B车站设备测点、故障告警、历史工况数据,数据越权泄露;
3、无按钮级功能权限,普通运维可删除告警记录、启停联动引擎、修改采集参数,违规操作无法管控;
4、无岗位角色划分,不符合地铁调度员、车站运维、系统管理员、访客四级人员岗位职责;
5、工控内网离线环境,不能引入Saas权限组件、第三方OAuth服务,需要轻量化自研原生RBAC权限;
6、数字孪生大屏、告警后台、运维HMI页面无权限拦截,涉密调度页面可随意访问。
结合城市轨道交通ISCS安全验收规范、内网工控部署要求,本篇自研轻量化RBAC权限体系,贴合本项目现有线路、车站租户架构,新增权限五张核心业务表,接口+页面双重权限拦截、数据行级隔离,零改动原有业务核心代码,完成ISCS人员权限、功能权限、数据权限全闭环。

二、ISCS权限整体业务架构

2.1 原有五大Kafka消费组业务无侵入

本次权限服务为独立网关拦截层、业务数据过滤层,不修改采集、联动、大屏、告警、时序库任意源码,业务消费链路完全不变:
现场设备→OPCUA网关→采集服务→Kafka五大消费组(联动/大屏/时序/告警/报表)
新增:权限拦截网关 + 账号角色服务 + 数据权限过滤切面

2.2 地铁ISCS专属四级岗位角色(贴合业主运维定岗)

✅ 超级管理员Role0:全线所有车站、所有子系统、全部功能权限,系统配置、服务启停、参数修改权限
✅ OCC调度管理员Role1:全线大屏查看、告警处置、联动场景手动投切,禁止删除底层采集配置
✅ 车站运维员Role2:绑定单一车站,仅查看本站设备、告警、曲线,仅操作本站本地设备
✅ 只读访客Role3:大屏预览、数据查看,无任何确认、复归、参数修改、联动操作权限

2.3 双层权限校验模型(工控项目强制要求)

1、功能权限:菜单路由、按钮操作、接口接口URL拦截,控制新增/修改/删除/手动联动权限
2、数据权限:线路LineId、车站StationId行级过滤,实现跨站点、跨线路数据物理隔离

三、数据库RBAC五表设计(贴合项目原有租户字段)

沿用全局lineId、stationId租户字段,和测点、告警、时序库实体字段完全统一,无缝联动。

3.1 权限核心五表SQL脚本

– 1.系统用户表 绑定所属线路、所属车站

CREATETABLEiscs_sys_user(idBIGINTAUTO_INCREMENTPRIMARYKEYCOMMENT'主键',usernameVARCHAR(32)NOTNULLCOMMENT'登录账号',passwordVARCHAR(64)NOTNULLCOMMENT'加密密码',real_nameVARCHAR(20)NOTNULLCOMMENT'运维人员姓名',phoneVARCHAR(11)DEFAULT''COMMENT'联系电话',line_idVARCHAR(32)NOTNULLCOMMENT'绑定线路权限',station_idVARCHAR(32)DEFAULT''COMMENT'绑定权限车站,空=全线权限',user_statusTINYINTDEFAULT1COMMENT'0禁用 1正常',create_timeDATETIMENOTNULL,update_timeDATETIMENOTNULL,UNIQUEKEYuk_username(username))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COMMENT='ISCS系统运维用户表';

– 2.系统角色表

CREATETABLEiscs_sys_role(idBIGINTAUTO_INCREMENTPRIMARYKEY,role_nameVARCHAR(32)NOTNULLCOMMENT'角色名称',role_codeVARCHAR(32)NOTNULLCOMMENT'角色标识',role_descVARCHAR(128)DEFAULT''COMMENT'岗位描述',create_timeDATETIMENOTNULL)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COMMENT='系统岗位角色表';

– 3.用户角色关联表 一对多

CREATETABLEiscs_user_role(idBIGINTAUTO_INCREMENTPRIMARYKEY,user_idBIGINTNOTNULLCOMMENT'用户ID',role_idBIGINTNOTNULLCOMMENT'角色ID',UNIQUEKEYuk_user_role(user_id,role_id))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COMMENT='用户角色关联中间表';

– 4.系统菜单按钮权限表

CREATETABLEiscs_sys_menu(idBIGINTAUTO_INCREMENTPRIMARYKEY,parent_idBIGINTDEFAULT0COMMENT'父菜单ID',menu_nameVARCHAR(64)NOTNULLCOMMENT'菜单名称',menu_pathVARCHAR(128)DEFAULT''COMMENT'前端路由地址',perms_tagVARCHAR(128)DEFAULT''COMMENT'后端接口权限标识',menu_typeTINYINTNOTNULLCOMMENT'1菜单 2功能按钮',sort_numINTDEFAULT0,statusTINYINTDEFAULT1)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COMMENT='菜单+按钮权限表';

– 5.角色菜单关联表

CREATETABLEiscs_role_menu(idBIGINTAUTO_INCREMENTPRIMARYKEY,role_idBIGINTNOTNULL,menu_idBIGINTNOTNULL,UNIQUEKEYuk_role_menu(role_id,menu_id))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COMMENT='角色菜单权限绑定表';

3.2 初始化基础角色数据(项目开箱即用)

– 初始化四大岗位角色
INSERT INTO iscs_sys_role(role_name,role_code,role_desc,create_time) VALUES
(‘超级管理员’,‘admin’,‘系统全权限,运维配置、服务管理’,‘2026-01-01 00:00:00’),
(‘OCC调度管理员’,‘occ_scheduler’,‘调度中心大屏、告警、联动操作权限’,‘2026-01-01 00:00:00’),
(‘车站运维人员’,‘station_operator’,‘单车站设备运维、告警确认权限’,‘2026-01-01 00:00:00’),
(‘只读访客’,‘visitor’,‘大屏预览、数据查看,无操作权限’,‘2026-01-01 00:00:00’);

四、SpringSecurity 工控专属配置改造

4.1 Maven权限核心依赖

<!-- SpringSecurity 安全权限依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><!-- 工具、加密、切面依赖 --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId></dependency>

4.2 YAML工控权限自定义配置

ISCS权限全局配置

iscs:security:# 接口白名单:登录、WebSocket心跳、健康检测直接放行ignore-urls:-/iscs/user/login-/iscs/screen/ws/**-/iscs/screen/alarm/ws/**-/actuator/health# 密码加密盐值 工控内网固定密钥password-salt:iscs-subway-2026# 开启车站数据权限拦截切面data-auth-open:true

五、权限核心完整业务代码

5.1 登录用户上下文DTO(存储数据权限+功能权限)

importlombok.Data;importjava.util.List;/** * 工控登录用户上下文 * 携带:账号信息、角色、功能权限、线路数据权限、车站数据权限 */@DatapublicclassIscsUserContext{// 用户基础信息privateLonguserId;privateStringusername;privateStringrealName;// 角色编码集合privateList<String>roleCodeList;// 后端接口权限标识集合privateList<String>permsList;// 数据权限:绑定线路IDprivateStringdataLineId;// 数据权限:绑定车站ID 空=全线放行privateStringdataStationId;}

5.2 SpringSecurity安全配置类(关闭csrf、适配工控WebSocket)

importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;importorg.springframework.security.config.annotation.web.builders.HttpSecurity;importorg.springframework.security.config.annotation.web.configuration.EnableWebSecurity;importorg.springframework.security.config.http.SessionCreationPolicy;importorg.springframework.security.web.SecurityFilterChain;importorg.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;importjavax.annotation.Resource;importjava.util.List;/** * ISCS工控安全权限配置 * 适配WebSocket长连接、关闭跨域csrf、开启注解权限、数据权限切面 */@Configuration@EnableWebSecurity@EnableGlobalMethodSecurity(prePostEnabled=true)publicclassIscsSecurityConfig{@ResourceprivateIscsTokenAuthFiltertokenAuthFilter;@ResourceprivateList<String>ignoreUrls;@BeanpublicSecurityFilterChainfilterChain(HttpSecurityhttp)throwsException{http// 工控内网关闭csrf防护,适配大屏WebSocket、接口调用.csrf().disable()// 无状态token登录,关闭session会话.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()// 白名单直接放行.authorizeRequests().antMatchers(ignoreUrls.toArray(newString[0])).permitAll()// 其余所有接口必须认证.anyRequest().authenticated().and();// 自定义Token拦截器前置执行http.addFilterBefore(tokenAuthFilter,UsernamePasswordAuthenticationFilter.class);returnhttp.build();}}

5.3 车站数据权限AOP切面(核心:自动过滤本站数据)

/** * 数据权限切面:自动拦截告警、测点、大屏、时序查询接口 * 根据登录用户绑定stationId自动拼接SQL过滤条件,实现行级隔离 */@Aspect@Component@Slf4jpublicclassIscsDataAuthAspect{@Value("${iscs.security.data-auth-open}")privateBooleandataAuthOpen;@Pointcut("execution(* com.iscs.*.controller.*.*(..))")publicvoiddataAuthPointCut(){}@Before("dataAuthPointCut() && @annotation(IscsDataAuth)")publicvoiddataFilter(JoinPointpoint,IscsDataAuthiscsDataAuth){if(!dataAuthOpen){return;}// 获取当前登录用户数据权限IscsUserContextuserContext=UserContextUtil.getCurrentUser();// 超级管理员、OCC调度放行全部车站数据if(Objects.equals("admin",userContext.getRoleCodeList().get(0))||Objects.equals("occ_scheduler",userContext.getRoleCodeList().get(0))){return;}// 车站运维、访客:强制绑定当前账号车站ID,接口参数强制覆盖StringuserStationId=userContext.getDataStationId();Object[]args=point.getArgs();// 统一覆盖入参stationId,禁止篡改参数越权查询for(Objectarg:args){if(arginstanceofBaseQueryParam){BaseQueryParamparam=(BaseQueryParam)arg;param.setStationId(userStationId);}}}}

5.4 登录接口+注解权限使用示例

/** * 权限运维接口、业务接口权限注解使用 */@RestController@RequestMapping("/iscs/alarm")publicclassAlarmAuthController{/** * 按钮功能权限校验:仅管理员、调度可确认告警 */@PostMapping("/confirm")@PreAuthorize("hasPermission('alarm:confirm')")@IscsDataAuthpublicResult<Void>confirmAlarm(@RequestBodyAlarmOperateParamparam){alarmService.confirmAlarm(param);returnResult.success();}/** * 只读接口:全部登录用户可访问,自动数据隔离 */@GetMapping("/history/page")@IscsDataAuthpublicResult<PageVO<AlarmRecordVO>>pageAlarm(BaseQueryParamparam){returnResult.success(alarmService.pageList(param));}}

六、业务模块联动权限对接方案

6.1 数字孪生大屏权限对接

1、不同角色登录大屏,自动隐藏无权车站拓扑、涉密调度面板;
2、车站运维账号仅加载本站孪生画面,屏蔽全线区间、其他车站设备;
3、操作按钮权限隔离:访客隐藏告警确认、联动手动投切按钮。

6.2 告警、时序、联动引擎权限绑定

1、时序曲线查询、SOE事故追忆:自动过滤非本站历史工况数据;
2、场景联动手动启停:仅超级管理员+OCC调度拥有操作权限;
3、告警删除、批量处置:拦截车站运维人员越权操作。

6.3 WebSocket长连接权限校验

大屏、告警WebSocket连接携带Token,后端拦截非法连接,未登录账号禁止订阅实时设备、告警数据流。

七、工控现场落地痛点&解决方案

痛点1:工控内网离线环境,无法引入第三方云端权限框架
方案:原生SpringSecurity自研轻量化权限,零外部依赖、离线可用、无云端对接,适配工控内网部署规范。
痛点2:跨车站人员越权查询设备、告警数据,安监验收不通过
方案:AOP切面行级数据过滤,强制绑定账号所属车站,参数篡改也无法越权查询。
痛点3:功能按钮无管控,普通运维修改联动策略、删除运维数据
方案:后端注解+前端按钮双重拦截,按钮级精细化权限管控。
痛点4:贴合地铁定岗编制,适配调度、车站运维、管理员岗位职责
方案:预设四大原生岗位角色,直接匹配业主运维人员编制,开箱即用无需二次开发。
痛点5:新增权限服务,改动原有业务代码、影响系统稳定性
方案:切面无侵入开发,业务服务、Kafka消费、采集代码零修改,不影响行车核心业务。

八、运维面板配套功能

1、HMI后台新增用户管理、角色配置、菜单权限配置运维页面;
2、支持账号绑定线路、绑定车站可视化配置,一键分配数据权限;
3、权限操作日志留存:账号登录、权限变更、越权访问行为日志审计;
4、账号禁用、密码重置、在线账号强制下线工控运维功能;
5、权限开关热插拔,调试环境可一键关闭权限拦截,提升开发效率。

九、本篇总结

本篇完成ISCS系统人员-角色-菜单-功能-数据全套RBAC权限闭环,贴合地铁安监安全验收、人员定岗运维规范,基于SpringSecurity自研工控轻量化权限体系,实现接口注解拦截、WebSocket连接鉴权、线路+车站数据租户隔离、四级岗位角色权限划分。
全文无侵入改造前十五篇所有业务代码,完美对接数字孪生大屏、三级告警服务、TDengine时序查询、自动化联动引擎全部模块,解决工控系统越权访问、跨站数据泄露、违规操作、权责混乱核心验收痛点,适配GoA4全自动无人驾驶少人运维、内网离线部署场景,代码架构可直接项目上线交付。


专栏连载说明
8年地铁综合监控一线开发实战专栏,全套ISCS从底层OPC采集、Kafka多消费组、联动引擎、孪生大屏、时序库、告警体系、RBAC权限全部连载完结,贴合轨交项目交付、工控毕设开发。

http://www.gsyq.cn/news/1529647.html

相关文章:

  • HoRain云--React 元素渲染
  • 2026 广州 LV 包包回收排行:持证鉴定报价透明,变现靠谱 - 奢侈品回收评测
  • 2026宁波黄金回收TOP1优选 合规高价服务领跑本地市场 - 奢侈品回收测评
  • Unity透明窗口:打破应用边界,让UI悬浮在桌面之上
  • 如何用NewJob智能插件3倍提升求职效率:一眼识别有效职位
  • 赤峰市回收奢侈品手表包包去哪好?整理了5家本地实体店对比记录 - 千叶啊
  • 深度定制C标准库:嵌入式开发中控制台I/O与多线程安全配置实战
  • 2026 年黄石装修公司实力排行榜 靠谱家装品牌精选推荐 - 速递信息
  • 技术揭秘:如何实现跨厂商帧生成的DLSS-G替代方案与开源兼容层
  • Spek音频频谱分析工具:3个步骤让你快速掌握音频可视化技术
  • 093、成本控制与 Token 监控:用量统计、预算预警、模型降级与成本报告
  • WCT1011B ADC与PWM实战:从寄存器配置到电机控制应用
  • 先避免毁灭性错误,再谈聪明决策。
  • i.MX CAAM与SNVS安全子系统实战:硬件密钥管理与主动防御
  • AndroidIDE终极指南:在手机上构建专业级Android应用开发环境
  • 嵌入式安全机制:ECSM与FCCU在功能安全系统中的协同设计与实战
  • GEO优化单条客户线索成本是多少
  • MSC8251 DDR内存ECC错误处理与中断系统配置实战指南
  • UEFITool 0.28:UEFI固件分析工具终极指南
  • FlexRay消息缓冲区:汽车实时通信的硬件数据管理核心
  • 嵌入式系统时钟与功耗管理:MSC711x PLL配置与低功耗模式实战
  • 如何永久保存微信聊天记录?完整指南让数据真正属于你
  • 如何高效使用Dism++:Windows系统优化工具完整指南
  • 深入解析MSC8113 DSI接口:主机接口设计、时序配置与调试实战
  • 深入解析AHB-Lite交叉开关仲裁机制:从总线竞争到智能调度
  • 朝阳市奢侈品手表包包出手怎么卖高价?5家本地回收店实地询价分享 - 凯撒是大帝
  • 2026黄石黄金回收价格参考 教你挑选靠谱回收店铺 - 润富黄金回收
  • 踩坑记录:项目里既有poi-tl又有老版POI?版本冲突导致NoSuchMethodError的排查与解决
  • AI 的 USB-C 接口:MCP 到底怎么让大模型连接文件、数据库和工具
  • RustDesk 1.4.6 官方版下载(夸克网盘+百度网盘,SHA256校验)