现在集中展示用户-角色-权限管理的功能,因此,所有数据表一律简化处理。
 
1 后台管理效果
(1)角色管理
(2)权限管理
 
2 数据库设计(MSSQL)
(1)用户表dbo.Users
类型
说明
UserId
int
主键,标识列
Name
nvarchar(50)
 
Password
nvarchar(50)
 

(2)角色表dbo.Roles

类型
说明
RoleId
int
主键,标识列
Name
nvarchar(50)
 

(3)权限表dbo.Autorities

类型
说明
AutorityId
int
主键,标识列
Name
nvarchar(50)
方便管理员等用户操作
Code nvarchar(50) 用于代码判断

(4)用户权限表dbo.UserRoles

类型
说明
UserId
int
联合主键,外键到dbo.Users.UserId
RoleId
int
联合主键,外键到dbo.Roles.RoleId
(5)角色权限表dbo.RoleAuthorities
类型
说明
RoleId
int
联合主键,外键到dbo.Roles.RoleId
AuthorityId
int
联合主键,外键到dbo.Authorities.AuthorityId
3 程序设计
(一)设计思路
(1)使用自定义过虑器(Filter),用于执行动作(Action)之前进行权限验证,当无相应权限时跳转无权限提示页面。
(2)在每个动作(Action)添加Filter元标注,并在标注中传入权限代码
[AuthorityManageFilter(Code="UserCreate")]
public ActionResult UserCreate()
{...}
(3)权限检查方法:
public bool AuthorityCheck(string code)
{
...//遍历该用户的角色和角色下的权限进行检查,有对应权限则返回true,否则返回false
}
(二) 代码实现
(1)AuthorityFilter
 
//权限验证
public class AuthorityFilter : ActionFilterAttribute
{
public string Code { set; get; }//要验证的权限的代码
 

        public override void OnActionExecuting(ActionExecutingContext filterContext)

 
{
CookieHelper cookie = new CookieHelper();
HttpResponseBase response = filterContext.HttpContext.Response;
 
if (!cookie.AuthorityCheck(Code)
&& filterContext.RequestContext.HttpContext.Request.RawUrl != "/nopermission"

)

//为了避免连登录、退出登录、进入无权限提示页面的权限都没有,此处要按需排除一些url
{
     response.Redirect("/nopermission");
}
 
        base.OnActionExecuting(filterContext);

        }

 
}
 
(2)Action的调用
 
[AuthorityManageFilter(Code="UserCreate")]
[AuthorityManageFilter(Code="UserDelete")]//可添加多个?
public ActionResult UserCreate()
{...}
 

(3)权限检查方法,是CookieHelper中的一个方法

public bool AuthorityCheck(string code)
{
using(var context = new Entity())
{
var user = context.Find(this[UserId]);
if(user!=null)
{
foreach(var role in user.Roles)
{
foreach(var authority in role.Authorities)
{
if(authority.Code == code)
{
return true;
}
}
}
}
else
{
return false;
}
}
}
 
总结:
1 优点:简单,快捷。当一个版本已经发布时,所有的权限即已经定下来,不允许增减或修改,虽然如此,仍旧可以快速实现出一套行之有效的用户-角色-权限管理解决方案;并且它应是开放的,当整个项目增加新的功能时,只需要更改数据库和相应的Action进行扩展。
2 缺点:不够灵活,即它只能管理原有的权限,而不能通过配置增加新的权限或删除权限等,当然,这个是由于设计的简化处理决定的,可以设计得更加灵活一点,即这个权限Code值不需要显式传入,而可以根据controller和action的名字,从数据库中相应表(当然要新加表)读取相应的权限代码,然后加以验证,不过,这样一样,虽然灵活多了,但是对于管理员等来说,操作上则麻烦得多了,而且要求操作人员要懂代码,这个看起来似乎是没什么必要。
3 可以改进的地方:(1)硬编码。虽然没有直接写在action内容的脚手架代码,但其实或多或少有几分相似,因为一个action就要相应地写上一个filter,也许可以将配置写在web.config文件中,然后只需要将filter加在controller上,而不是加在每个action上,并且不需要传参数,但也许这样的改进效果也有限,因为这可能意味着没完没了地更新web.config中的这个配置参数的开始;(2)简单和灵活需要做出一个平衡。也许吧,但若要增加一个新的功能的话,能否不更新项目源码而通过配置就产生了?至少对于一般情况下,新增功能,还是要更改源代码的,因此,顺便增加一下权限管理的内容,也无可厚非吧。所以,若非特殊项目,灵活性还是先不考虑了。
4 所以,以上,是我认为一个比较满意的asp.net mvc下的用户-角色-权限解决方案。
 
本人原创,欢迎转载,转载请注明出处。

asp.net mvc的权限管理设计的更多相关文章

  1. ASP.NET MVC通用权限管理系统(响应布局)源码更新介绍

    一.asp.net mvc 通用权限管理系统(响应布局)源码主要以下特点: AngelRM(Asp.net MVC)是基于asp.net(C#)MVC+前端bootstrap+ztree+lodash ...

  2. ASP.NET MVC 用户权限-1

    MVC框架的开发网站的利器,MVC框架也开始越来越流行了.对于.NET ,微软也发布了MVC框架,做网站通常要涉及到用户的权限管理,对于.NET MVC 框架的用户权限管理又应该怎样设置呢?下面通过示 ...

  3. SQL Server:OA权限管理设计的实现 下

    SQL Server:OA权限管理设计的实现 下   OA系统权限管理设计方案     不同职责的人员,对于系统操作的权限应该是不同的.优秀的业务系统,这是最基本的功能.     可以对“组”进行权限 ...

  4. 基于Spring Security2与 Ext 的权限管理设计与兑现

    基于Spring Security2与 Ext 的权限管理设计与实现 一.Spring Security介绍 Spring Security的前身Acegi,其配置及使用相对来说复杂一些,因为要配置的 ...

  5. ASP.net MVC 构建layui管理后台(构造基础仓储)<1>

    本文章为ASP.net MVC 构建layui管理后台,第一篇. 使用EF+ado.net 实体数据模型模式进行底层的数据库连接. 在项目添加一个类库Model 在类库Model上添加一个ado.ne ...

  6. 关于ASP.NET MVC的权限认证的一些总结

    最近在学ASP.NET MVC的权限认证的一些东西,上网搜索了一阵,发现网上的方法大多数是以下几类: 一.FormsAuthentication.SetAuthCookie(admin.Name, f ...

  7. ASP.NET MVC +EasyUI 权限设计(二)环境搭建

    请注明转载地址:http://www.cnblogs.com/arhat 今天突然发现博客园出问题了,老魏使用了PC,手机,平板都访问博客园了,都是不能正常的访问,原因是不能加载CSS,也就是不能访问 ...

  8. ASP.NET MVC +EasyUI 权限设计(一)开篇

    在前一段时间中,老魏的确非常的忙碌,Blog基本上没有更新了,非常的抱歉,那么在后面的时间中,老魏会尽量的抽时间来写的,可能时间上就不太富裕了.今天开始呢,老魏会和大家分享一下关于权限设计的有关文章, ...

  9. ASP.NET MVC +EasyUI 权限设计(四)角色动作

    请注明转载地址:http://www.cnblogs.com/arhat 由于最近的事情比较多,一直忙于工作和照顾老婆,所以老魏更新的速度慢了,本来写文章就要占据工作和生活很多的时间,这也就是院子中很 ...

随机推荐

  1. PHP07 函数

    学习要点 函数的定义 自定义函数 函数的工作原理和结构化编程 PHP变量范围 声明及应用各种形式的PHP函数 递归函数 使用自定义函数库 匿名函数和闭包 常用PHP系统函数 PHP7函数新特性 函数的 ...

  2. mybaits2-Dao开发

    项目结构: 1.创建project,导入相关依赖(前提).配置db.properties与mybaits-config #mysql驱动 db.driver=com.mysql.jdbc.Driver ...

  3. Python打包成exe,pyc

    D:\mypython\path\ C:\Python27\Scripts\pyinstaller.exe -w mypython.py # Python打包成exe D:\mypython\path ...

  4. 前端 (cookie )页面进入存储一次

     <!--引入jq--> <script> var isShowTip = window.sessionStorage.getItem("isShow") ...

  5. UVA-1625-Color Length(DP LCS变形)

    Color Length(UVA-1625)(DP LCS变形) 题目大意 输入两个长度分别为n,m(<5000)的颜色序列.要求按顺序合成同一个序列,即每次可以把一个序列开头的颜色放到新序列的 ...

  6. 最近公共祖先-三(RMQ-ST)

    描述 上上回说到,小Hi和小Ho使用了Tarjan算法来优化了他们的"最近公共祖先"网站,但是很快这样一个离线算法就出现了问题:如果只有一个人提出了询问,那么小Hi和小Ho很难决定 ...

  7. 读书笔记之《编程小白的第1本Python入门书》

    本书电子版下载地址:百度网盘 写在前面:你需要这本书的原因 有没有那一个瞬间,让你想要放弃学习编程? 在我决心开始学编程的时候,我为自己制定了一个每天编程1小时的计划,那时候工作很忙,我只能等到晚上9 ...

  8. string和数值之间的转换

    string和数值之间的转换 to_string(val) 一组重载函数,返回数值val的string表示val可以是任何算数类型. stoi(s,p,b),stol(s,p,b),stoul(s,p ...

  9. Fidder详解-抓取HTTPS清求(Web/App)抓包分析(靠谱篇)

    为什么要学Fidder抓包? 学习接口,必须要学http协议,不要求您对协议的掌握有多深.只是希望你能够了解什么是协议.协议的报文.状态码等等!本文通过抓包工具Fidder带你进入接口的大门.我们通过 ...

  10. jquery版本的问题造成第二次全选无效

    注意:第一种方式点击全选按钮 第一次全选有用第二次全选无效.因为jquery1.7以上的版本用此方法只能第一次好用,第二次就会失效,用第二种方式解决