现在集中展示用户-角色-权限管理的功能,因此,所有数据表一律简化处理。
1 后台管理效果
(1)角色管理
(2)权限管理
2 数据库设计(MSSQL)
(1)用户表
dbo.Users
项
|
类型
|
说明
|
UserId
|
int
|
主键,标识列
|
Name
|
nvarchar(50)
|
|
Password
|
nvarchar(50)
|
|
项
|
类型
|
说明
|
RoleId
|
int
|
主键,标识列
|
Name
|
nvarchar(50)
|
|
项
|
类型
|
说明
|
AutorityId
|
int
|
主键,标识列
|
Name
|
nvarchar(50)
|
方便管理员等用户操作
|
Code | nvarchar(50) | 用于代码判断 |
项
|
类型
|
说明
|
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下的用户-角色-权限解决方案。
本人原创,欢迎转载,转载请注明出处。