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

制作此系统的初衷是为了让这个权限系统得以“通用”。就是生产一个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 <= )
{
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 = )

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

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

  1. 基于RBAC模型的通用企业权限管理系统

    1. 为什么我们需要基于RBAC模型的通用企业权限管理系统 管理信息系统是一个复杂的人机交互系统,其中每个具体环节都可能受到安全威胁.构建强健的权限管理系统,保证管理信息系统的安全性是十分重要的.权限 ...

  2. ASP.NET MVC 通用角色权限管理系统

    RightControl 介绍 .NET 通用后台角色权限管理系统,已完成.项目地址:http://106.14.77.184/Admin/Login 码云地址:https://gitee.com/L ...

  3. [golang][vue] 前后端分离、微服务架构等等---通用后台权限管理系统001

    emmm暂未开源,先上图.其实有很多东东都未完成,一步一步来吧 这里是大图 这里会有二维码的,暂未写完哈 注册界面 后台 测试地址 测试地址al.landv.pw:88 测试账号:admin 测试密码 ...

  4. 使用 Shiro 设计基于用户、角色、权限的通用权限管理系统

    一.前言 在大型的信息管理系统中,经常涉及到权限管理系统 下面来个 demo,很多复杂的系统的设计都来自它 代码已经放到github上了,地址:https://github.com/larger5/s ...

  5. Winform开发框架之权限管理系统的改进

    权限管理系统,一直是很多Mis系统和一些常见的管理系统所需要的,所以一般可以作为独立的模块进行开发,需要的时候进行整合即可,不需要每次从头开发,除非特殊的系统需求.我在Winform开发框架介绍中的随 ...

  6. express搭建权限管理系统

    express搭建权限管理系统 权限管理,是管理系统中的常见组件.通常需要定义资源,把资源调配给用户,通过判断用户是否有权限增删改查来实现. 初衷: 使用express开发过的项目大大小小加在一起也有 ...

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

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  8. MVC + EF + Bootstrap 2 权限管理系统入门级(附源码)

    MVC .EF 学习有大半年了,用的还不是很熟练,正好以做这样一个简单的权限管理系统作为学习的切入点,还是非常合适的. 开发环境: VS 2013 + Git + MVC 5 + EF 6 Code ...

  9. 权限系统与RBAC模型概述

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/SJQ. http://www.cnblogs.com/shijiaqi1066/p/3793894.html ...

随机推荐

  1. .net 使用ffmpeg.exe进行音频转码

    #region 音频转换 private int AudioIntervalTime = 100, iAudio = 0; private string strPath = "D:\\web ...

  2. Esfog_UnityShader教程_镜面反射SpecularReflection

    系列教程第四篇,本来打算昨天写的,有些小偷懒就今天写了,这一期我们来讨论一下关于镜面反射的基本原理和具体代码.这一篇是承接着上一篇<Esfog_UnityShader教程_漫反射DiffuseR ...

  3. invalid END header (bad central directory offset) 异常解决方法

    今天版本升级时,一个ear包在传到aix下,weblogic后启动出现 invalid END header (bad central directory offset) 后来才发下是文件传输中出现了 ...

  4. 从Windows 2012标准版升级到数据中心版,标准评价版本升级到标准体验版本并激活

    对于Windows 7.Windows 8操作系统,可以在图形界面中通过输入序列号,从低版本直接升级到高的版本,例如从Windows 7家庭版升级到专业版或旗舰版.而对于Windows Server ...

  5. Testin云测试平台初体验

    这几天偶然接触到了一个叫做Testin的云测试平台,经过一番体验,感觉还是不错的,因为里面提供了大量的测试机型,可以针对Android手机的严重碎片化现象做出比较全面的测试,同时Testin的测试内容 ...

  6. NHibernate系列文章十三:NHibernate批量更新

    摘要 对于批量插入和批量修改数据,通过设置NHibernate配置文件的BatchSize属性,可以大量减少NHibernate与数据库交互的次数. 1. Batch属性介绍 设置了BatchSize ...

  7. 利用jquery实现自动登录

    前提是需要引入jquery和jquery.cookie html 用户名:<input type="text" id="name"/><br ...

  8. 如何进行服务器的批量管理以及python 的paramiko的模块

    最近对公司的通道机账号进行改造管理,全面的更加深入的理解了公司账号管理的架构.(注:基本上所有的机器上的ssh不能使用,只有部分机器能够使用.为了安全的角度考虑,安装的不是公版的ssh,而都是定制版的 ...

  9. brackets快捷键使用

    ctrl+b 当选中一个文本时,会出现相同的文本,被高亮显示 按ctrl+b 相同的文本就全部获得了焦点 这样就可以同时更改这些相同的文本ctrl+e    打开或关闭快速编辑alt+u 注释ctrl ...

  10. avalon2学习教程12数据验证

    avalon2砍掉了不少功能(如ms-include,ms-data),腾出空间加了其他更有用的功能.数据验证就是其中之一.现在avalon2内置的验证指令是参考之前的oniui验证框架与jquery ...