分享:简单的权限管理系统

最近找工作,没事东拼西凑了一个权限管理系统,仅供参考。

开发环境vs2019,sqlserver express2017

后台使用asp.net core,数据库使用ef core访问,前台使用jquery+bootstrap+admilte

先上个图

说明:

1、系统前台使用ajax访问后台,返回数据由自定义方法public IActionResult Json(Result result, ToastType toastType, string message)包装,在前端用ajaxToast方法处理返回的数据

2、site.js中包含了一些自定义的js函数对表单进行处理,表单验证使用jquery.validate

3、系统分为四个模块:用户管理、角色管理、菜单管理、权限管理。大部分都是简单的增、删、改、查,其中用户管理可以配置和角色的关系,角色管理可以配置和权限的关系。

4、权限和MVC的Action对应,每个权限的访问由PermissionAccess标记控制,标记分为匿名访问(不用登陆就可以访问)、默认访问(登陆后都可以访问)、特定访问(需要配置角色、权限、用户之间的关系才能访问)、跟随父权限访问(每个操作都可能会附带一些ajax访问,代码中直接配置)。

5、权限的显示由PermissionDisplay来控制,分别对应菜单、按钮、接口。菜单的生成在Home/Index中。每个页面对应按钮的显示、隐藏由BaseController中生成的 ViewBag.PCodes,在前台_Layout.cshtml中的refreshButtonPermission函数控制

6、代码主要逻辑在BaseController中,通过重写OnActionExecuting控制权限

        public override void OnActionExecuting(ActionExecutingContext context)
        {
            base.OnActionExecuting(context);

            //获取缓存数据
            var allPermission = CacheHelper.GetCache<List<Permission>>(CacheKeys.AllPermission);

            //1、如果当前有匿名标记,则不需要登陆直接可以访问
            //2、判断登陆,如果没有登陆则跳转到登陆页面
            //3、如果当前有默认标记,则直接访问
            //4、判断当前用户是否有权限访问当前方法

            //获取请求的路由对应权限
            var area = context.RouteData.Values["area"]?.ToString();
            var controller = context.RouteData.Values["controller"]?.ToString();
            var actoin = context.RouteData.Values["action"]?.ToString();
            var requestRoute = $"/{area}/{controller}/{actoin}".Replace("//", "/");
            var requestPermission = allPermission.FirstOrDefault(t => t.Route == requestRoute);

            //获取自定义特性的父权限路由对应的访问权限
            var filters = context.Filters.Where(t => (t as ParentPermissionAttribute) != null);
            var filterRoutes = filters.Select(t =>
            {
                var attribute = t as ParentPermissionAttribute;
                return $"/{attribute.Area}/{attribute.Controller}/{attribute.Action}".Replace("//", "/");
            }).ToList();

            var actionPermissions = allPermission.Where(t => filterRoutes.Any(m => m == t.Route)).ToList();

            if (requestPermission != null)
            {
                actionPermissions.Add(requestPermission);
            }

            if (actionPermissions.Count == 0)
            {
                context.Result = Content("该权限未开放");
                return;
            }

            //包含匿名访问权限,直接访问
            if (actionPermissions.Any(t => t.Access == PermissionAccess.Anonymous))
            {
                return;
            }

            //判断是否登陆,后面的验证都是登陆为基础
            if (CurrentUser == null)
            {
                context.Result = new RedirectResult($"/SystemManage/Account/Login?returnUrl={HttpUtility.UrlEncode(Request.Path)}");
                return;
            }

            //如果该功能显示为页面,处理页面按钮显示
            if (requestPermission != null && requestPermission.Display == PermissionDisplay.Menu)
            {
                //查看该页面下所有的按钮权限
                var buttons = allPermission.Where(t => t.Display == PermissionDisplay.Button && t.MenuId == requestPermission.MenuId).ToList();
                var dict = new Dictionary<string, bool>
                {
                    //添加默认,防止为空时页面出错
                    { "", true }
                };

                buttons.ForEach(t =>
                {
                    //生成按钮在当前用户下的权限列表
                    dict.Add(t.Code, CurrentPermissions.Any(m => m.Id == t.Id));
                });
                ViewBag.PCodes = JsonConvert.SerializeObject(dict);
            }

            //默认权限,登陆后访问
            if (actionPermissions.Any(t => t.Access == PermissionAccess.Default))
            {
                return;
            }

            //最后验证特定权限
            //用户所有权限是否包含当前权限
            var hasPermission = false;
            foreach (var item in CurrentPermissions)
            {
                if (actionPermissions.Any(t => t.Id == item.Id))
                {
                    hasPermission = true;
                    break;
                }
            }
            if (hasPermission)
            {
                return;
            }
            else
            {
                context.Result = Content("无权限访问");
                return;
            }
        }

7、大部分代码都有注释,直接断点调试就能查看就行了

8、数据库直接用HelloPermission.bak还原。也可以由ef生成数据库,初始化数据在script.sql中

9、代码地址  https://pan.baidu.com/s/1lFn5LqnCjLhtK9gVoAOiFA   提取码 tpc6

原文地址:https://www.cnblogs.com/donghaidong/p/11231114.html

时间: 2024-10-24 06:14:14

分享:简单的权限管理系统的相关文章

一个简单通用权限管理系统,求各位帮忙看看

最近为公司做一个能源行业的管理平台系统,既然系统定位为平台,自然需要插件化.高通用性等,当前正在进行权限部分的设计,由于本人最近一直忙于开发.设计工作,手中没有一个比较通用的权限管理系统,所以打算顺便借此机会设计一套,我对权限系统没有什么研究,看了一天园子里的相关文章,初步做了个数据库设计,希望各路大神帮忙看看,下面附上数据表结构图,献丑了... 一个简单通用权限管理系统,求各位帮忙看看,布布扣,bubuko.com

SpringMvc+hibernate+easyui简单的权限管理系统

用户登录:   主界面:   资源管理:   角色管理:   用户管理:   部门管理:   源码在群共享: 189811613  群满了,直接发链接吧链接:http://pan.baidu.com/s/1gdPXqAB 密码:yo6u

Asp.Net Core 项目实战之权限管理系统(2) 功能及实体设计

0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之权限管理系统(2) 功能及实体设计 3 Asp.Net Core 项目实战之权限管理系统(3) 通过EntityFramework Core使用PostgreSQL 4 Asp.Net Core 项目实战之权限管理系统(4) 依赖注入.仓储.服务的多项目分层实现 5 Asp.Net Core 项目实

通用权限管理系统菜单展示的一个技巧

从这篇文章,希望您了解吉日嘎拉通用权限管理系统菜单项展示技巧. 项目中使用了吉日嘎拉的通用权限管理系统,几十个子系统均由该权限管理系统管理. 在系统中配置好相关菜单及非菜单项,配置截图: 菜单权限设置截图 通过下拉菜单进入其中的一个子系统 子系统中的菜单项(菜单项表示该项会在前端需要展示出来,用于用户点击的项目),其中的公开表示所有人均可看到该菜单项目. 子系统中的非菜单项(非菜单项表示该项目不需要在前端展示出来,比如有些在页面中的弹出窗口.按钮等项目) 通过单点登录到子系统以后,通过一个服务获

Asp.Net Core 项目实战之权限管理系统(3) 功能及实体设计

0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之权限管理系统(2) 功能及实体设计 3 Asp.Net Core 项目实战之权限管理系统(3) 通过EntityFramework Core使用PostgreSQL github源码地址 0 功能设计 实现一个最简单最基本的权限管理系统,主要包括组织机构管理.角色管理.用户管理.功能管理.角色授权.

转载——分享一个html+js+ashx+easyui+ado.net权限管理系统

EasyUI.权限管理 这是个都快被搞烂了的组合,但是easyui的确好用,权限管理在项目中的确实用.一直以来博客园里也不少朋友分享过,但是感觉好的要不没源码,要不就是过度设计写的太复杂看不懂,也懒得去看懂,还有一些不是在推广自己的代码生成器就是在卖权限组件,看着漂亮的UI和完善的功能就是没源码学习,真是恼人. 前段时间公司项目阶段性结束了,就抽空把权限控制的部分抽取出来写了个html+js+ashx+ado.net的权限管理系统分享给一些初学者,这个权限系统demo没有MVC.没有ORM.数据

SpringMVC+Spring Data JPA+Shiro+EasyUI简单权限管理系统

SpringMVC+Spring Data JPA+Shiro+EasyUI简单权限管理系统 一直想做一个管理系统,希望它简洁,能做一个demo使用.以后在研究学习的时候,可以在此基础上增加代码.我觉得权限管理系统很值得做,因为涉及关系数据库模式的设计,能学到很多东西.万事开头难,先做个简单的,以后再慢慢完善的.任何事情关键是要做,不能停留在想. 前端 由于之前没有多少前端编程经验,所以做起前端比较吃力.之前前端使用Bootstrap,发现需要自己编写很多前端代码,虽然花费了很多时间,但是页面做

分享一套MVC4+EF5+EasyUI技术实现通用权限管理系统

课程讲师:闲筝 课程分类:.NET框架 适合人群:高级 课时数量:150课时 更新程度:完毕 服务类型:B类(VIP服务类课程) 用到技术:MVC.EF.T4.Log4net.EasyUI.rdlc.spring.net等 涉及项目:通用权限管理系统.十二生肖案例.EasyUI150项示例 课程咨询QQ:2050339477 链接:http://ibeifeng.taobao.com/index.htm?spm=2013.1.w5002-9616636101.2.aNEcLW 项目背景: 自从微

Angularjs,WebAPI 搭建一个简易权限管理系统

Angularjs,WebAPI 搭建一个简易权限管理系统 Angularjs名词与概念(一) 1. 目录 前言 Angularjs名词与概念 权限系统原型 权限系统业务 数据库设计和实现 WebAPI项目主体结构 Angularjs前端主体结构 2. 前言 Angularjs开发CRUD类型的Web系统生产力惊人,与jQuery,YUI,kissy,Extjs等前端框架区别非常大,初学者在学习的过程中容易以自己以往的经验来学习Angularjs 往往走入误区,最典型的特征是在的开发过程中,使用