CRL通用权限控制系统

此系统能满足一般权限/菜单控制需求,不需要重复开发,达到多系统共用的目的

权限判断是基于请求路径,意味着是页面级控制,可能不符合一些要求,当然你也可以把路径细化实现

菜单为二级菜单,暂不支持多级

此系统基于CRL框架内置业务开发,CRL框架详细信息

运行环境 .Net Mvc4 默认数据库MSSQL

此权限系统主要概念

  • 系统(属于哪个系统,分平台进行权限控制)
  • 菜单(跟系统挂钩,此系统有哪些菜单)
  • 角色(有哪些角色)
  • 用户(有哪些用户,跟角色挂钩)
  • 权限(角色或用户有哪些菜单的权限)

菜单

菜单结构如下,主要属性

  • 名称
  • 路径(菜单访问路径)
  • 导航显示(是否在菜单列表显示)
  • 是否禁用

菜单子级

角色

角色权限

用户

用户权限

用户权权限继承角色权限,只会多,不会少,继承的权限不能更改

设置好这些,权限系就能正常工作了,需要进行权限控制的项目需要部署权限控制,菜单效果如下

布署权限控制,以MVC为例

  登录

  因为用户是在权限系统里,所以登录也由权限系统来提供  

public ActionResult Login(string userName, string passWord, string verifyCode)
        {
            string error;

            bool a = CRL.RoleAuthorize.EmployeeBusiness.Instance.CheckPass(userName, passWord, out error);//验证密码
            if (!a)
            {
                ModelState.AddModelError("", error);
                return View();
            }

            var u = CRL.RoleAuthorize.EmployeeBusiness.Instance.QueryItem(b => b.AccountNo == userName);
            CRL.RoleAuthorize.EmployeeBusiness.Instance.Login(u, "admin", false);//FORM 验证登录
            CRL.RoleAuthorize.MenuBusiness.Instance.RemoveUserMenuCache(u.Id, 2);//清除用户菜单缓存
            string returnUrl = Request["returnUrl"];
            if (string.IsNullOrEmpty(returnUrl))
            {
                returnUrl = "/";
            }
            return Redirect(returnUrl);
        }

  布署菜单

  登录后需要显示当前用户可用菜单

  获取菜单分组

var menus = new Dictionary<CRL.RoleAuthorize.Menu, List<CRL.RoleAuthorize.Menu>>();
    string url = System.Web.HttpContext.Current.Request.Url.PathAndQuery.ToLower();

    var currentUser = CRL.RoleAuthorize.EmployeeBusiness.Instance.CurrentUser;//获取当前登录用户  //获取系统编号为1的菜单,注意改这里
    menus = CRL.RoleAuthorize.MenuBusiness.Instance.GetUserMenuByGroup(CRL.RoleAuthorize.EmployeeBusiness.Instance.CurrentUser.Id, 1);

  显示菜单

@foreach (var item in menus.Keys)//循环主菜单
{
    var childs = menus[item];
    <h2>@item.Name</h2>
    <ul>
    @foreach (var item2 in childs)//子菜单
    {
        if (!item2.ShowInNav)//不在导航显示则跳过
        {
            continue;
        }
        <li>
            <a href="@item2.Url"  title="@item2.Name">@item2.Name</a>
        </li>
    }
        </ul>
}

  实现权限控制

  MVC路径都是基于控制器的,很好控制,在基类实现权限检测方法  

/// <summary>
        /// 对应当前系统ID
        /// </summary>
        int currentSystemId = 1;
/// <summary>
        /// 当前登录用户
        /// </summary>
        public CRL.Person.IPerson CurrentUser
        {
            get
            {
                return CRL.RoleAuthorize.EmployeeBusiness.Instance.CurrentUser;
            }
        }
 /// <summary>
        /// 访问权限检查,按当前请求路径
        /// </summary>
        /// <returns></returns>
        public bool CheckAccess()
        {
            bool a = CRL.RoleAuthorize.AccessControlBusiness.Instance.CheckAccess(currentSystemId, CurrentUser.Id);
            return a;
        }

  在控制器方法里调用该方法

public ActionResult Update()
        {
            if (!CheckAccess())
            {
                return Content("没有权限");
            }
            return Content("访问成功");
        }

到这里,权限系统就能正常工作了,由于使用了缓存,菜单查找效率非常高,可能会造成菜单不同步的情况,需要清空缓存

项目里自带了一个测试项目,更改项目里DBConnection文件夹,.config数据连接文件,连接正确的SQL数据库

运行RoleControl项目,登录 用户名:admin 密码:admin (如需更改,更改/config/CustomSetting.config) 加入测试菜单

运行RoleControlWebTest 登录 用户名:test 密码:test

项目下载地址: 百度盘

时间: 2024-10-29 21:56:19

CRL通用权限控制系统的相关文章

通用权限管理平台权限控制--按钮权限

通用权限管理系统的重点在于如何更好的控制按钮操作权限,在下结合自己的平台经验,在使用MVC的环境下,使用自定义MVC控件,并且结合系统的权限控制于一体,减少业务在权限方面的控制,使对按钮权限的控制更加简洁. 通用权限控制系统的权限用户控件实现以后,在实际使用中如下所示: @Html.Eap().Button().Id("btnAdd").Name("添加").Class("easyui-linkbutton").IconClass("i

通用权限系统设计

权限系统是否要独立于应用系统进行设计一直存在争论,通用的权限成指数的提高了系统的复杂程度,同时执行也影响了系统的执行效率.但是一旦设计完成一个通用的权限系统,可以用于多个项目,大大节省了成本.总结就是一句,为一个项目设计一个权限控制系统是正确的,通用只是为了方便后面项目的重用,节省后续项目的成本,当然前期需要投入了. 权限系统一般分为功能权限.数据权限.字段权限三种,最简单也是最容易设计成通用的就是功能权限.权限系统的设计说简单也简单,就是能满足当主体(用户)要操作(访问)某个资源(数据)时,去

ASP.net MVC 基于角色的权限控制系统的实现

一.引言 我们都知道ASP.net mvc权限控制都是实现AuthorizeAttribute类的OnAuthorization方法. 下面是最常见的实现方式: public class CustomAuthorizeAttribute : AuthorizeAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { if (!filterContext.RequestContext

ASP.NET MVC 基于角色的权限控制系统的示例教程

上一次在 .NET MVC 用户权限管理示例教程中讲解了ASP.NET MVC 通过AuthorizeAttribute类的OnAuthorization方法讲解了粗粒度控制权限的方法,接下来讲解基于角色的权限控制方法. 基于角色的权限控制方法概述 基于角色的权限控制系统RBAC(Role Based Access Control)是目前最流行,也是最通用的权限控制系统.所谓基于角色的权限控制,就是将各个操作权限分组,每一个组就是一个角色,举个例子:管理员拥有所有的权限,编辑就只拥有写文章和发布

多租户通用权限设计(基于casbin)

多租户通用权限设计(基于 casbin) 所谓权限控制, 概念并不复杂, 就是确认某个操作是否能做, 本质上仅仅就是个bool判断. 权限几乎是每个系统必不可少的功能, 和具体业务结合之后, 在系统中往往表现的非常复杂和难于控制, 很大部分原因是把权限和具体业务结合的太过紧密, 把业务的复杂度也加入到权限控制中来了. 一直以来, 都有个想法, 想做一套简单好用的通用权限系统, 和任何业务都没有关系, 仅仅就是权限本身的功能. 对此, 做过很多尝试, 由于设计能力有限, 最后都不了了之, 没能坚持

通用权限管理系统学习心得

一直相信阅读优秀的代码,是学习编程的最好方式,经过一段时间对吉日嘎拉通用权限管理系统的学习和使用,我从中受益良多,其中不乏一些优秀的设计思想,其中给我印象比较深刻的有几点,我将按照我个人的理解写下学习笔记,希望能给自己这段时间的学习留下点什么,同时也希望能别人能够通过阅读我的文章来获得一些帮助. 这篇文章我也来探讨一下数据网格设置功能的实现 每个网格的设置对应保存在本地启动目录下UserParameter的文件下的一个XML文件,其中XML文件的命名规则:窗体名称_网格名称.xml (如窗体名称

【原创】C#通用权限管理-程序安全检查,这些你一定要考虑到位

接触通用权限已经一年,现在使用已经很熟练,分享通用权限管理下面的一些好的开发思想. 安全漏洞对于一个小项目来说,可能不是特别的重视,对于一个大项目来说,这是特别重要需要注意的,特别是在项目开发中的就要警惕,下面我列举一些项目开发中需要注意的安全 页面文本框的检查,每个文本框填写的内容是什么类型就是必须用正则表达式进行强制限制,不能随便输入无用的信息,这是第一步 对于C/S的程序,我们可以直接用正则表达式来限制,对于B/S的页面程序,我们也是需要js验证和后台代码的验证,因为浏览器可以禁止js,让

基于吉日嘎底层架构的通用权限管理Web端UI更新:参考DTcms后台界面

经一周的研究学习,看了国内的H+.HUI等,国外的PaperDashboardPro.Make.Metronic BootStrap等,最终选定用一个轻量的,适合中国人的,来自DTcms的后台管理UI来改造吉日嘎拉的通用权限管理Web端的UI. js+css+图片文件如下 新增一个Menu.ashx文件,用于输出当前用户权限可以查看的所有菜单. 新增Main.aspx文件用于主框架,所有内容也放在名为fraContent的iframe中.其它涉及的登录跳转小修改暂时略过. 有图有真相,先上图:

通用权限管理系统接口文档V4.2 版本之消息接口介绍

通用权限管理系统提供的消息接口可实现消息获取,消息发送,底层使用Redis对消息进行缓存,解决消息的并发请求对数据库的压力. 前端可以通过客户端轮询来获取最新消息,前端效果截图如下: 1.发送消息 2.收到消息 3.消息回复 前端效果参考代码,前端可根据自己的需要进行功能封装,实现即时消息的功能,主要是JS实现的消息轮询和发送功能, Html部分: <div style="display: none" id="ShowMessage"> <tabl