asp.net mvc的权限管理设计

现在集中展示用户-角色-权限管理的功能,因此,所有数据表一律简化处理。
 
1 后台管理效果
(1)角色管理
asp.net mvc的权限管理设计
(2)权限管理
asp.net mvc的权限管理设计
 
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下的用户-角色-权限解决方案。
 
本人原创,欢迎转载,转载请注明出处。