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

制作此系统的初衷是为了让这个权限系统得以“通用”。就是生产一个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. DestroyWindow函数注意事项

    最近遇到这样一个问题:将一个窗口句柄以参数的形式传递给一个线程,在线程中使用完之后要将窗口销毁,调用DestroyWindow销毁窗口是返回false,GetLastError的结果为5:拒绝访问,而 ...

  2. 数据结构&算法-单链表

    1.引言 工作一年了,感觉越来越懒散,把很多基础性的东西都慢慢遗忘了,最近想趁着还没忘完,回顾一下,整理了点笔记,分享一下. 如有错的地方,欢迎大家怒喷. 2.学习 我们就从最简单的链表开始吧. 链表 ...

  3. The default for KeyValuePair

    if (getResult.Equals(new KeyValuePair<T,U>())) or this: if (getResult.Equals(default(KeyValueP ...

  4. Centos中的Docker 配置:将loop-lvm改为derict-lvm

    重新装了个虚拟机,回顾一下最近三天的工作: Centos 查看版本 cat /etc/redhat-release yum -y upgrade 升级所有包,不改变软件设置和系统设置,系统版本升级,内 ...

  5. ERROR 1267 (HY000): Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation '='

    多表查询出错,貌似是编码问题. 我比较的两个表的某个字段,设为查询条件,两个字段等于某个值,参照网上的某些论坛调用alter语句,但是依旧没有效果.最后直接拆分成两个条件,a.字段1=x值,b.字段2 ...

  6. C#开发Windows服务 附简单实例实现禁止QQ运行

    本实例主要实现下面三个基本功能 1.C#开发windows服务 2.禁止QQ等程序运行 3.为windows服务创建自动安装程序 下面针对这三个基本功能进行实现 一.C#开发windows服务 Win ...

  7. NHibernate系列文章十六:使用程序集管理NHibernate项目(附程序下载)

    摘要 在实际的项目中,经常是将NHibernate的实体关系映射类做成独立的工程(assembly dll),只对外提供Session调用的接口.这个程序集作为数据访问层,可以被上面的多个工程(ASP ...

  8. 第五百七十七天 how can I 坚持

    今天看了个电影<七月与安生>,挺不错,周冬雨,马思纯,然后就突然有了个想法,过年不回家了,去趟拉萨,或许只是想想吧,不知道有没有勇气去啊,何况是自己一个人,但是又想,旅行要是没点冒险的话, ...

  9. nc检测端口是否正常服务的一个命令

    最近碰到一个项目,前端用apache htttpd进行发布(80端口),通过双机负载均衡转发到后端的两个tomcat进行处理(8081和8082端口),现在需要随时监控这三个端口的情况,一旦down掉 ...

  10. 基于WDF的PCI/PCIe接口卡Windows驱动程序(2)-开发者需要了解的WDF中的一些重要的概念

    原文出处:http://www.cnblogs.com/jacklu/p/4646601.html 本科毕业设计是这方面的工作,所以想开几篇博客来介绍使用WDF开发PCI/PCIe接口卡的驱动程序方法 ...