C#中控制权限的逻辑写法

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等其他用户创建的数据

这样就实现了​​基于角色关系的数据行级权限控制​​!

相关推荐
卢锡荣8 分钟前
Type-c OTG数据与充电如何进行交互使用应用讲解
c语言·开发语言·计算机外设·电脑·音视频
A懿轩A21 分钟前
【Java 基础编程】Java 变量与八大基本数据类型详解:从声明到类型转换,零基础也能看懂
java·开发语言·python
2301_8112329821 分钟前
低延迟系统C++优化
开发语言·c++·算法
我能坚持多久24 分钟前
D20—C语言文件操作详解:从基础到高级应用
c语言·开发语言
橘子师兄41 分钟前
C++AI大模型接入SDK—ChatSDK封装
开发语言·c++·人工智能·后端
人工智能AI技术1 小时前
【C#程序员入门AI】本地大模型落地:用Ollama+C#在本地运行Llama 3/Phi-3,无需云端
人工智能·c#
上天_去_做颗惺星 EVE_BLUE1 小时前
Docker高效使用指南:从基础到实战模板
开发语言·ubuntu·docker·容器·mac·虚拟环境
2401_857683541 小时前
C++中的原型模式
开发语言·c++·算法
s1hiyu1 小时前
C++动态链接库开发
开发语言·c++·算法
(❁´◡`❁)Jimmy(❁´◡`❁)1 小时前
CF2188 C. Restricted Sorting
c语言·开发语言·算法