• 2022年9月13日

.Net6后台用户权限控制模块开发方案

用户权限控制系统是B/S架构管理系统的关键模块,网上有多种方案,本文将分享一个相对比较简单的方案。

后台用户权限包含:

1、菜单权限:

1.1 菜单加载:后台加载菜单时,只加载分配给用户的菜单

1.2 页面加载:只能进入授权菜单对应的url页面

2、接口权限:

2.1 API调用权限:view页面只能调用授权api

基于此,我们将通过Microsoft.AspNetCore.Mvc.Filters的IAuthorizationFilter接口,配合Mysql数据库实现该方案。

数据库设计:

类型备注
id自增
usernamevarchar(32)用户名
passwordvarchar(64)密码
role_idint
用户表
类型备注
id自增
namevarchar(32)菜单名称
pathvarchar(100)view地址
菜单表
类型备注
id自增
namevarchar(32)组名称
menu_listtext菜单列表
api_listtext接口列表
用户组
类型备注
id自增
namevarchar(32)接口名称
pathvarchar(100)接口地址
接口表

关键代码:

代码中涉及到数据库的读写就不详细写了,使用的是sqlsugar,各位根据自己情况修改下即可!


Filter.cs文件
    public class AuthorizationFilter : IAuthorizationFilter
    {
        public void OnAuthorization(AuthorizationFilterContext context)
        {
            var result = context.Result;
            if (context.Filters.Any(it => it is Microsoft.AspNetCore.Mvc.Authorization.IAllowAnonymousFilter))
            {

            }
            else
            {
//这里获取用户登陆时写入session的user和role对象
                var user = Toolkits.Get<SystemUser>(context.HttpContext.Session, "user");
                var role = Toolkits.Get<Role>(context.HttpContext.Session, "role");
                    if (user == null || user.Id < 1)
                { //用户未登录或者登录账户不存在
                        result = new JsonResult(
                            new
                            {
                                code = 401,
                                message = "请登录",
                                success = false,
                                data = ""
                            }
                            );
                } 
                else if (context.RouteData.Values["controller"].ToString() == "View的控制名")
                {//控制器预设了个专门的视图控制器,这里判断视图页权限
                    string path = ( context.RouteData.Values["controller"].ToString() + "/" + context.RouteData.Values["action"].ToString()).ToLower();
                    if (new MenuManager().Count(it => it.Path.ToLower() == path && SqlFunc.ContainsArray<int>(role.MenuList,it.Id))>0)
                    {

                    }
                    else
                    {
                        result = new RedirectResult("~/Error/Unauthority.cshtml") ;
                    }
                }                  
                else
                {//判断api权限
                    string path = ( context.RouteData.Values["controller"].ToString() + "/" + context.RouteData.Values["action"].ToString() ).ToLower();
                    if (new ApiManager().Count(it => it.Path.ToLower() == path && SqlFunc.ContainsArray<int>(role.ApiList, it.Id)) > 0)
                    {

                    }
                    else
                    {
                        result = new JsonResult(
                            new {
                            code = 403,
                            message = "无权访问",
                            success = false,
                            data=""
                            }
                            );
                    }
                }
                   
            }

            context.Result = result;
        }
    }
*Controller.cs等控制类系列文件

[TypeFilter(typeof(AuthorizationFilter))] //控制器级权限过滤,部分Action可以在Action上增加[TypeFilter(typeof(AllowAnonymousFilter))]修改成任意人均可访问
public class *Controller : ControllerBase
{

}

至此,基础的权限控制关键已完成,只需要编写相应的后台页面即可实现通过后台设定用户组的菜单权限、接口权限等。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注