通过脚本自定义MOU数据权限
通过脚本组件实现自定义的数据权限控制逻辑,满足复杂的业务权限需求。
场景
人员信息通过【班级】字段维护当前人员所属的班级,班级可以通过【辅导员】字段维护当前班级的辅导员。需要控 制辅导员只能查看自己班级下的人员数据。
实现
第一步:配置查询MOU数据权限
通过人员对象的查询MOU配置来配置自定义权限控制行为:
- 勾选启用查询阶段的数据权限控制
- 选择数据权限过滤模式为:字段与接口返回数组进行匹配
- 选择匹配字段,因为接口返回了人员的ID,因此选择ID字段
- 选择控制权限的接口(在第二步中定义)
第二步:新增数据权限接口
新增【MOU获取有权限人员ID接口】,接口用途设置为MOU权限控制,通过脚本组件自定义脚本行为。
通过脚本代码定义当前登录用户有权限查询的人员信息ID数组:
提示
如果没有获取到数据,应该将参数赋值为任意无法匹配到值的数组,下面示例填充了Guid.Empty到数组中,保证无权限时无法匹配到数据。
using System;
using System.Linq;
using System.Collections.Generic;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Chameleon.Common;
using Chameleon.Common.Context;
using Chameleon.Common.Exceptions;
using Chameleon.Common.Models;
using Chameleon.Database;
using Chameleon.SDK;
public class ChameleonCSharpScript
{
public object Execute(ComponentContext context, ChameleonSDK sdk)
{
var loginUserId = ChameleonContext.Current.UserId;
var classFilter = FilterBuilder.Contains("counselors", loginUserId);
var classList = sdk.DbContext.GetList("StudentAffairs.Class", classFilter, new[] { "_id" });
var classIds = classList.Select(c => Convert.ToString(c["_id"])).ToList();
if (classIds.Count == 0)
{
classIds.Add(Guid.Empty.ToString());
}
var stuFilter = FilterBuilder.In("class", classIds);
var stuListByClass = sdk.DbContext.GetList("System.UserInformation", stuFilter, new[] { "_id" });
var stuIds = stuListByClass.Select(s => Convert.ToString(s["_id"])).ToList();
if (stuIds.Count == 0)
{
stuIds.Add(Guid.Empty.ToString());
}
return stuIds;
}
}
备注
通过定义一个通用的接口来满足不同场景下当前登录用户可以访问的人员列表,该接口可以在不同对象中复用,来满足一次定义,全局有效的效果。
使用场景
- 根据用户角色动态过滤数据
- 实现复杂的数据权限逻辑
- 跨对象关联权限控制
- 组织架构级别的数据隔离