现在集中展示用户-角色-权限管理的功能,因此,所有数据表一律简化处理。
 
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. JavaSE-28 hashCode()方法、equals()方法和==相关概念

    概述 Java中,Object类是所有类的基类:如果一个类没有明确继承其他已定义的类,则默认继承Object类. Object类提供了以下方法,对于其他方法,请参考前期专题描述. hashCode() ...

  2. SQL Sever中多列拼接成一列值为NULL

    查询出数据 SELECT a.ID AS KYMain_ID , ',' + a.Leader + ',' AS KYMain_Leader , ), b.TaskLeader) FROM TB_KY ...

  3. ubuntu卸载编译安装的软件

    cd 源代码目录 make clean ./configure make make uninstall

  4. LeetCode(74) Search a 2D Matrix

    题目 Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the fo ...

  5. LeetCode(19) Remove Nth Node From End of List

    题目 Given a linked list, remove the nth node from the end of list and return its head. For example, G ...

  6. 【CodeForces 426】div1 B The Bakery

    Some time ago Slastyona the Sweetmaid decided to open her own bakery! She bought required ingredient ...

  7. string和数值之间的转换

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

  8. 根据不同的产品id获得不同的下拉选项 (option传多值)

    <td> 没有 value 所以要在<td>里面加上input  同时text 为hidden这样就不会显示value的值 <td><select id='g ...

  9. python模块以及导入出现ImportError: No module named ‘xxx‘问题

    python中,每个py文件被称之为模块,每个具有__init__.py文件的目录被称为包.只要模块或者包所在的目录在sys.path中,就可以使用import 模块或import 包来使用如果你要使 ...

  10. HA架构

    HA架构是个什么东西? 阅读文章:浅谈web应用的负载均衡.集群.高可用(HA)解决方案