c
if (!parmsEntity.ContainsKey("_NoViewData_") && objEntity != null && objEntity.IaUnusual)
{
var viewRoleUsers = GetViewRoleUsers(oc, workId);
if (viewRoleUsers.All(r => r.RoleUserCode != "-1"))
{
var roleUserCodes = viewRoleUsers.Select(r => r.RoleUserCode).ToList();
roleUserCodes.Add(workId);
if ((config == null || (config != null && !config.Value.Equals("1"))) && !roleUserCodes.Contains("001"))
{
roleUserCodes.Add("001");
}
var roleUserStr = string.Join("','", roleUserCodes.Distinct());
StringBuilder stringBuilder = new StringBuilder();
bool hasCreateUser = hasCreateUserForSQL(vQueryString, paras, oc, stringBuilder);
if (hasCreateUser)
{
stringBuilder.AppendFormat(@" where _ViewData_.CreateUser in('{0}')", roleUserStr);
}
else
{
stringBuilder.Append(" where 1=2");
}
if (!objEntity.ViewRoleField.IsNullOrEmpty())
{
var tmpField = objEntity.ViewRoleField.Split(';');
foreach (var item in tmpField)
{
stringBuilder.AppendFormat(@" or _ViewData_.{1} in('{2}')", vQueryString, item, roleUserStr);
}
}
vQueryString = stringBuilder.ToString();
}
}
接下来我为大家讲解大体逻辑:
第一步:查询用户角色关系
c
public List<W_SYS_ViewRoleUser> GetViewRoleUsers(string oc, string uc)
{
string key = (oc + uc).ToMD5Encrypt16();
var obj = cache.Hash_Get<List<W_SYS_ViewRoleUser>>("GetViewRoleUsers", key);
if (obj == null)
{
obj = this.FindList<W_SYS_ViewRoleUser>(r => r.ObjectCode.Equals(oc) && r.UserCode.Equals(uc)).ToList();
cache.Hash_Set<List<W_SYS_ViewRoleUser>>("GetViewRoleUsers", key, obj);
}
return obj;
}
参数:oc(对象/模块代码),workId(当前用户工号)
查询:从W_SYS_ViewRoleUser表查询该用户在该模块下的角色-用户映射关系
缓存:使用MD5缓存键提升性能
第二步:排除超级管理员
c
if (viewRoleUsers.All(r => r.RoleUserCode != "-1"))
如果查询结果中包含RoleUserCode = "-1"的记录,说明是超级管理员,跳过所有权限控制
如果没有-1,说明是普通用户,继续权限控制
第三步:构建权限用户列表
c
var roleUserCodes = viewRoleUsers.Select(r => r.RoleUserCode).ToList();
roleUserCodes.Add(workId); // 添加自己
viewRoleUsers中的RoleUserCode就是有权限查看的用户工号列表
这个列表代表了:当前用户可以看到哪些用户创建的数据
第四步:添加特殊权限
c
if (!roleUserCodes.Contains("001")) { roleUserCodes.Add("001"); }
虚拟工号"001"有特殊权限(如系统管理员)

完整权限逻辑总结
查询权限配置:获取当前用户在当前模块能查看哪些用户的数据
超级管理员判断:如果有-1权限,跳过所有限制
构建权限列表:包含同角色用户 + 自己 + 虚拟管理员
生成SQL条件:只能查看权限列表中用户创建的数据
实际应用示例
假设用户UserA在项目模块:
能查看:UserA(自己)、UserB、UserC、001创建的项目数据
不能查看:UserD、UserE等其他用户创建的数据
这样就实现了基于角色关系的数据行级权限控制!