利用RBAC模型实现一个通用的权限管理系统

  本文主要描述了一个通用的权限系统实现思路与过程。也是对此次制作权限管理模块的总结。

制作此系统的初衷是为了让这个权限系统得以“通用”。就是生产一个web系统通过调用这个权限系统(生成的dll文件),就可以实现权限管理。这

个权限系统会管理已生产系统的所有用户,菜单,操作项,角色分配,权限分配,日志等内容。

  实现此功能从正常访问和非法访问两个方面入手。正常访问即用户登录系统后只能看到或操作自己拥有的菜单;非法访问即通过拼写url等途径访问系

统的某个功能;所以程序除了实现用户登录后获取用户拥有的菜单权限,更要挡住用户的非法请求。两者缺一不可。

一.概念

     实现这个功能主要利用RBAC权限设计模型,英文(Role-Based Access Control)译为基于角色的权限管理又叫基于角色的访问控制。

二.数据库设计

1.系统表:因为要达到"通用",所以这个表会记录各个系统。其他用户、菜单、操作、权限表每条记录都会对应系统代码。

字段说明:Code      —> 系统标识代码

SysName  —> 系统名称

2.菜单表:记录菜单。每个功能当成一个菜单,菜单有url属性,用户通过点击菜单来访问对应功能;

字段说明:ID                  —> 主键,自增标识

MenuName     —> 菜单名称

        PageUrl                —> 菜单对应url

        PId                   —> 菜单父级Id

           Lv        —> 菜单等级,分一级菜单和二级菜单

ControllerAction  —> 菜单唯一标识,用来做权限控制

SystemCode    —> 系统标识代码

3.操作表:此表主要是为了判断用户是否有来操作某个具体功能,如常用的【删除】功能等操作都放在这个表里;

字段说明:ID                —> 主键,自增标识

OprateName   —> 操作名称

         OperateCode     —> 操作标识代码

SystemCode       —> 系统标识代码

4.用户表:记录所有系统的使用用户。记录用户账号、密码等信息;

字段说明:ID            —> 主键,自增标识

UserName   —> 用户登录名称

        UserPwd         —> 用户登录密码

SystemCode   —> 系统标识代码

5.角色表:这是RBAC设计不可缺少的,记录角色信息,不同级别的角色拥有不同的权限。给用户分配角色也用到它;

字段说明:ID             —> 主键,自增标识

RoleName    —> 角色名称

SystemCode   —> 系统标识代码

6.权限表:存放用户的权限信息。在这个系统里我的设计是每个菜单,每个操作都对应一个权限记录。所以有一个字段[ActionType]来区分是菜单还是操作;

字段说明:ID             —> 主键,自增标识

PowerName —> 权限名称

        ActionId          —> 菜单或操作ID

        ActionType      —> 区分是菜单或操作

SystemCode    —> 系统标识代码

7.用户对应角色表:这个表负责关联用户和角色的关系。由于初次使用RBAC模型,又为了快速投入使用,因此在这次使用中没有考虑一对多的角色。所以

在这个系统里用户和角色都是一对一的关系,每个用户对应一个角色;

字段说明:ID             —> 主键,自增标识

UserId           —> 用户ID

        RoleId              —> 角色ID

SystemCode    —> 系统标识代码

8.角色对应权限表:这个表负责管理角色和权限的关系。角色和权限属于一对多的关系,每个角色对应多个权限;

字段说明:ID             —> 主键,自增标识

RoleId           —> 角色ID

        PowerId           —> 权限ID

SystemCode    —> 系统标识代码

9.日志表:这个应该容易理解,日志表记录用户操作系统的痕迹,像用户信息、访问url、时间等。

字段说明:ID             —> 主键,自增标识

UserId           —> 操作名称

        VisitUrl            —> 操作标识代码

Remark           —> 系统标识代码

CreateTime     —> 创建时间

SystemCode   —> 系统标识代码

三.程序设计

      上面说了数据库的构造,接下来讲一下此次程序的设计方案。开篇已经提过为了通用此项目最终生成dll文件以便其他系统调用,当然你也可以做成

webservice,还能满足跨平台。

这个系统不与任何业务系统公用数据访问层和业务逻辑层。即使两者使用一个相同的数据库,这个系统还是拥有独立的数据访问层和业务逻辑层,

当然这个情况只限于一个实现权限管理的“权限后台”。

在此我用了三层,添加了一个接口Service。其他系统只能访问这个接口调用自己需要的方法。这样做对于系统本身有利于避免方法被任意调用,功

能实现途径不一。对使用者也简洁明了。为了达到这个目的可以用关键字internal修饰数据访问层和业务逻辑层的类。程序结构如下图:

  继续说说这个接口提供了哪些方法和属性吧。

1.当前登陆用户:在系统中不少地方要用到它,比如展示登陆用户的账号,角色等,存放登录用户可以使用Session,也可使用Redis;

2.登录/退出方法;

2.登陆用户有权限访问的菜单集合:提供使用用户正常访问的菜单,例如树形菜单等;

3.子菜单集合:方法2也可实现,这个只不过多一个服务而已;

4.判断操作权限的方法:数据库中有一个操作表,通过操作代码去权限表里查询。判断登陆用户是否拥有某一个操作的权限,例如“删除”功能;

5.日志集合:满足各个系统查看日志的需要。

四.权限和日志

  这里的权限是为了挡住非正常途径的访问。实现思路是通过用户访问的url跟用户可以访问的菜单属性【ControllerAction】一一对比。为了便于理解,

在此用开发实例说明一下:

我做业务系统时UI框架用的是MVC4.0,他很好的支持Filter。因此在权限系统三层的基础上加了一个Filter文件夹,创建PowerAttribute类,提供验证

登录和验证权限两个类。

    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
    public class LoginAttribute : ActionFilterAttribute
    {
        /// <summary> 登录验证 </summary>
        /// <param name="filterContext"></param>
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var loginUser = UserService.LoginUser;
            base.OnActionExecuting(filterContext);
            if (loginUser.ID <= 0)
            {
                filterContext.Result = new RedirectResult("/home/login");
                filterContext.Result.ExecuteResult(filterContext);
            }
        }
    }
    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
    public class PowerAttribute : LoginAttribute
    {
        /// <summary> 访问权限验证 </summary>
        /// <param name="filterContext"></param>
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            LoginAttribute loginAttribute = new LoginAttribute();
            loginAttribute.OnActionExecuting(filterContext);

            var routeAction = HttpContext.Current.Request.RequestContext.RouteData.Values["Controller"] + "." +                               HttpContext.Current.Request.RequestContext.RouteData.Values["Action"];
            List<Menu> userOwnMenuList = MenuService.GetUserOwnMenuList().ResultModel as List<Menu> ?? new List<Menu>();

            var isHavepermission = userOwnMenuList.FirstOrDefault(m => m.ControllerAction.ToLower() == routeAction.ToLower()) != null;
            if (!isHavepermission)
            {
                HttpContext.Current.Response.Write("您没有权限访问");
                HttpContext.Current.Response.End();
            }
        }
    }

  访问【用户列表】时,只需在对应的Action上添加特性Power即可。

    // GET: /User/List
    // 用户列表页
    [Power]
    [Log(Desc = "查看用户列表")]
    public ActionResult List(string code = "", int page = 1)

  日志实现同上,就不再叙述了。整篇文字偏多,没有写实现接口的代码,是因为这些方法实现都很基础。不便登大雅之堂。

时间: 2024-08-01 03:35:20

利用RBAC模型实现一个通用的权限管理系统的相关文章

通用OA+权限管理系统源码 联系QQ:847129860

通用OA+权限管理系统源码 功能介绍:    1.本程序分为系统后台管理,内网,论坛,外网,外网后台管理    2.开发工具为VS2010,MVC4(razor视图引擎),数据访问为EntityFramework4.4,数据库为sql server 2008,UI插件为jquery-easyui-1.3.0,编辑器为kindeditor,上传文件为uploadify,表格插件Flexigrid,相册插件为lightbox    3.工程分为:CommWeb,Core,DAL,Entity,Too

XMwoods通用版权限管理系统 .net 联系QQ:847129860

XMwoods通用版权限管理系统 主要功能有:权限管理.角色管理.部门管理.用户管理.公司管理.模块管理.系统设置.一. 权限管理以关键字(Key)的方式来定义系统的权限,使系统权限分配更加贴合企业需求.提供给开发人员使用,权限的控制需要与系统功能的实现挂接.● 权限管理界面,可以进行系统权限的定义操作.● 用户权限管理,对用户权限进行自定义设置,也可以继承其他用户.角色 等权限.● 角色权限管理,对角色权限进行自定义设置,也可以继承其他角色 等权限.二.角色管理系统实现了内部员工户角色的统一管

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

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

Entity Framework技术系列之8:使用Entity Framework技术实现RBAC模型

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 前言 RBAC(Role-Based Access Control,基于角色的访问控制),是继DAC(Discretionary Access Control,自主访问控制)和MAC(Mandatory Access Control,强制访问控

通用数据权限管理系统设计

一: 应用场景: 在实际应用中,数据权限的控制点一般相对固定,如针对公司.部门.个人.客户.供应商等,也就是说数据权限一般针对指定数据类型下的一些数据对象. 例如:某公司有北京生产部.上海生产部和保定生产部,现在需要定义几种角色: 总部总监         -- 能察看所有生产部的产品: 北京生产部经理 -- 只能察看北京生产部的所有产品: 上海生产部经理 -- 只能察看上海生产部的所有产品: 保定生产部经理 -- 只能察看保定生产部的所有产品: 二:角色定义: 上述角色的定义如下: -----

[转]完整的权限管理系统,设计概要

很多人都知道以角色为基础的权限管理设计(RBAC),但是大部分人似懂非懂,不知道完整的权限管理系统都包括哪些内容.  在此以权限管理的使用场景来说明一下完整的权限管理内容.     一是鉴权管理,即权限判断逻辑.     1. 最基本的权限管理就是菜单管理,用户没有权限的功能模块在菜单节点上是不显示的.(很多人以为这就是权限管理!)      示例:普通业务人员登录系统后,是看不到[用户管理]菜单的.         2. 功能权限管理,B/S系统的功能体现为URL,所以功能权限管理主要是针对U

权限管理系统 Spring-authority

是由 spring+springmvc+hibernate+spring-security +easyui +boostrap 写的一个框架集合,目前实现了一个基础的权限管理系统,权限是基于细粒度的过滤,对于初学权限设计的人来说也算是个最简洁的权限实现,基于它来做项目,它只是做了一些绝大部分项目都应该做的一些基础功能. 1参考资料 http://blog.csdn.net/k10509806/article/details/6369131 http://www.cnblogs.com/wenxi

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 功能设计 实现一个最简单最基本的权限管理系统,主要包括组织机构管理.角色管理.用户管理.功能管理.角色授权.