如何在TFS 2018u1中按用户权限隐藏发布定义右键菜单项
基于用户权限隐藏TFS发布定义右键菜单命令的实现方案
针对你在TFS 2018u1中开发发布定义自定义右键菜单扩展时,想根据用户权限隐藏菜单项的需求,我整理了最靠谱的实现方案——直接利用扩展清单的内置约束机制,完全能解决你说的“前端不调用VSS.register()仍显示菜单”的问题,而且是从根源上优化可用性:
一、核心方案:在扩展清单中配置Security约束
这是服务器端层面的权限检查,会直接对没有对应权限的用户隐藏菜单项,完美避免菜单繁杂的问题,比前端做判断靠谱得多。
你需要在扩展清单的contributions数组里,给目标右键菜单命令添加constraints字段,示例配置如下:
{ "contributions": [ { "id": "custom-release-command", "type": "ms.vss-web.action", "targets": ["ms.vss-releaseManagement-web.release-definition-context-menu"], "properties": { "text": "我的自定义操作", "icon": "assets/icon.png", "action": "execute-custom-command" }, "constraints": [ { "name": "Security", "properties": { "namespaceId": "e298f1c5-97a0-461f-9c76-51a9761e1f4c", // 发布定义的安全命名空间GUID "namespaceToken": "releaseDefinitions/{releaseDefinitionId}", // 动态匹配当前发布定义 "permission": 256, // 对应"编辑发布定义"的权限位掩码 "allowSystemContext": false } } ] } ] }
关键参数说明:
name: 固定填Security,对应后台的SecurityFilter过滤器类namespaceId: 要检查的安全领域GUID,比如发布定义的安全命名空间GUID是e298f1c5-97a0-461f-9c76-51a9761e1f4c(你可以通过TFS的安全命名空间API确认具体值)namespaceToken: 权限检查的对象令牌,支持动态占位符,{releaseDefinitionId}会自动替换为当前选中的发布定义IDpermission: 权限的位掩码,比如发布定义的"编辑"权限是256,"删除"是1024,你可以根据需求调整对应的数值allowSystemContext: 一般设为false,避免系统上下文跳过权限检查
二、为什么前端不调用VSS.register()没用?
TFS的扩展菜单渲染逻辑是先由服务器端解析扩展清单,生成菜单结构后再推送到前端。前端的VSS.register()只是绑定菜单点击后的执行逻辑,并不会影响菜单是否显示。所以即使你不注册,菜单还是会被渲染出来,只是点击后无响应,这自然达不到隐藏菜单的目的。
三、关于constraints的补充说明
虽然官方文档没有详细记录constraints字段,但从TFX工具源码和后台程序集可以确认它的有效性:
constraints是Contribution对象下的数组,每个元素是ContributionConstraint类型- 后台内置了多种过滤器,除了
SecurityFilter,还有ExtensionLicensedFilter(检查扩展授权)、FeatureFlagFilter(检查功能开关)等,都可以按需使用 - 这种服务器端校验的方式,不仅能真正隐藏无权限的菜单,还比前端自行判断权限更安全可靠
内容的提问来源于stack exchange,提问作者Seva Alekseyev
相关产品推荐
相关产品推荐

