我们在做项目项目,经常会碰到权限体系,权限体系属于系统架构的一个最底层的功能,也是非常重要的功能,几乎在每个项目都会用到。那么我们该如何设计一个比较合理的且扩展性较强的权限体系呢?

经过多天的摸索,参考多个系统以及自己的经验,《沐雪微店系统 NetCore3.1》的权限体系是这样的。

 

  • 一、首先确定几个重要实体的关系:用户,角色,权限;这三者之间的关系如下:

asp.net Core3.1自定义权限体系-菜单和操作按钮权限

其中:

1、用户与角色是1对多关系(  1个用户只有1个角色,1个角色可以对应多个用户);

2、角色与权限组是1对1关系( 1个角色只有1个权限组,1个权限组只有1个角色)。

3、一个权限组里包含1个菜单和多个操作按钮;

4、操作按钮预先定义好最多的情况的枚举值;(比如  查看,新增,修改,删除,审核,下载,确认,回复)

这样的架构,相对来说比较合理,适合绝大多数系统使用了。(设计的越灵活,控制起来越困难,越困难越容易出现错误,所以要根据实际的情况控制灵活到什么程度即可;不要一口吃成胖子,想要一次性搞出无限灵活的权限系统。)

 

  • 二、对几个实体进行CRUD单实体操作(增,删,改,查)

 1、菜单的增删改查;

asp.net Core3.1自定义权限体系-菜单和操作按钮权限

2、权限组的增删改查:

asp.net Core3.1自定义权限体系-菜单和操作按钮权限

 

3、用户的增删改查:

asp.net Core3.1自定义权限体系-菜单和操作按钮权限

 

  • 三、用代码来实现权限系统

 大家在菜单管理页面,应该注意到有3个字段:--编码,链接地址和权限值;这些是我们写代码的时候需要用的。

1、创建一个控制器的父类--BaseController,这里只要有一个可以获取当前登录者的方法即可,类似如下代码:

        /// <summary>
        /// 当前登录者
        /// </summary>
        public PTLoginResp CurrentUser
        {
            get
            {
                PTLoginResp currentUser = new PTLoginResp();
                if (User.Identity.IsAuthenticated)
                {
                    var claimIdentity = (ClaimsIdentity)User.Identity;
                    string key = claimIdentity.FindFirst("tokenid").Value;
                    currentUser.id = LoginCredentials.PFDecodeRedisKeyOfUserId(key);

                    currentUser.user_name = claimIdentity.FindFirst("user_name").Value;
                    currentUser.real_name = claimIdentity.FindFirst("real_name").Value;
                    currentUser.mobile_phone = claimIdentity.FindFirst("mobile_phone").Value;
                    currentUser.role_id = ConvertHelper.LongParse(claimIdentity.FindFirst("role_id").Value, 0);

                }
                return currentUser;
            }
        }
View Code

相关文章: