权限管理简介
权限管理技术,一般用基于角色访问控制技术RBAC(Role Based Access Control)。它是把权限赋值于角色,角色一般也称为用户组;一个角色一个权限。比如管理员角色具有系统的所有权限,普通用户角色只有系统部分权限。添加用户时,我们只需要将某个角色赋予某个用户那么这个用户就拥有这个角色下的权限了,简单吧!
MVC具体实现
1采用AuthorizeAttribute过滤器:,因为它在MVC架构上首先运行,一般用于身份验证,
新建一个类RoleAuthorizeAttribute继承与这个类,重写AuthorizeAttribute类的OnAuthorizatio方法,这这个方法通过过滤器上下文filterContext获得请求的Controller和Actoion(Controller和Actoion的具体含义不在此解释了)
2 根据MVC的Route规则(在App_Start中可以设置路由,默认的规则是controller/action)确定页面请求的URL可以推断出,每一个Controller下的每一个Action都可以可以看作是一个权限。
3 在用户每次请求页面的URL时,判断用户的信息是否包含该页面URL的controller/action,这样判断出用户对这个页面的权限。在此我并没有判断controller/action,而是采用每一个页面都设置一个独一的编号,这个编号和controller/action一一对应,通过判断用户是否包含这个编号,确定用户对这个页面的权限。
编号和controller/action一一对应关系,保存在了配置文件
4 RoleAuthorizeAttribute类代码
public override void OnAuthorization(AuthorizationContext filterContext)
{
//base.OnAuthorization(filterContext);
var isAuth = false;
if (!filterContext.RequestContext.HttpContext.Request.IsAuthenticated)
{
isAuth = false;
}
if (filterContext.RequestContext.HttpContext.User.Identity != null)
{
var actionDescriptor = filterContext.ActionDescriptor;
var controllerDescriptor = actionDescriptor.ControllerDescriptor;
string controller = controllerDescriptor.ControllerName;//得到controller
string action = actionDescriptor.ActionName;//得到Action
string result = controller + "/" + action;
int[] num = new int[] { 10001, 10002, 10003 };//该用户权限列表的页面编号数据,假数据,实际项目中从后台得出
string[] Xnum = new string[num.Length];//用来存放该用户拥有权限对应的controller/action数据集合
for (int i = 0; i < num.Length; i++)
{
Xnum[i] = ConfigurationManager.AppSettings[num[i].ToString()] ?? "";//将num集合中对应的controller/action存在string[]集合Xnum中
}
//判断用户拥有的权限对应的controller/action数据集合中是否包含此页面的controller/action
if (Xnum.Contains(result))
{
isAuth = true;
}
}
//用户拥有的权限对应的controller/action数据集合中不包含此页面的controller/action,将页面跳转
if (!isAuth)
{
//filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "account", action = "login", returnUrl = filterContext.HttpContext.Request.Url, returnMessage = "您无权查看." }));
filterContext.Result = new RedirectResult("/ErrorPage.html");
return;
}
}
5 将需要验证权限的Action打上RoleAuthorizeAttribute标签
[RoleAuthorizeAttribute]
public ActionResult HomeIndex ()
{
return View();
}
网友评论