在MVC中,我们可以通过在action或者controller上设置Authorize[Role="xxx"] 的方式来设置用户对action的访问权限。显然,这样并不能满足我们的需求,
对于一般的MVC系统来说,如果我们定义一个controller来处理一个模块的话,我们大致有以下需求:
一,单个action的访问权限。如果删除,列表action
二,一个action两种权限,如edit(int? id)如果id为null则添加,或者修改
三,在此cotroller验证其它模块权限,比如,我们要在新闻模块获取新闻列表
四,对于某些通过模块,如分类,我们希望通过传入不同的参数可以验证不同模块的权限
对于四种情况,我理想的想法是:
对于第一种,直接制定controller的moduleid和action的权限
[Module(ModuleId=6)] public class Controller: Controller{ [SysAuthorize(Permission.List)] //设置action要验证的权限 public ActionResult List() }
对于第二种情况,我们希望通过参数来达到验证那个权限的目的:
[Module(ModuleId=6)] public class Controller: Controller{ //如果参数为null是将验证添加权限否则验证修改权限 [SysAuthorize(Permission.Add,Permission.Edit,"id",null)] public ActionResult Edit(int? id) }
对于第三种情况,我们可以为action验证指定单独的模块id
[Module(ModuleId=6)] public class Controller: Controller{ [SysAuthorize(9,Permission.List)] //此方面验证模块9的列表权限 public ActionResult List(int CType) }
对于第四种情况,我们可以为模块添加不同的参数module对应关系
[Module(ModuleId=5,"CType",1)] [Module(ModuleId=6,"CType",2)] public class Controller: Controller{ 如果当前传入CType为1则验证ModuleId=5,等于2是验证ModuleId=6 [SysAuthorize(Permission.List)] public ActionResult List(int CType) }
想法定好以后,我们就可以去实现了。
首先,我们定义一个module的特性:
/// <summary> /// 模块信息特性 /// </summary> [AttributeUsage(AttributeTargets.Class, Inherited = true, AllowMultiple = true)] public class ModuleAttribute : Attribute { public ModuleAttribute() { } public ModuleAttribute(int moduleId) { this.ModuleId = moduleId; } public ModuleAttribute(int moduleId, string parName, object value) : this(moduleId) { this.ParameterName = parName; this.ParameterValue = value; } /// <summary> /// 模块Id /// </summary> public int ModuleId { get; set; } /// <summary> /// 当前模块对应参数名 /// </summary> public string ParameterName { get; set; } /// <summary> /// 当前模块参数值 /// </summary> public object ParameterValue { get; set; } /// <summary> /// 验证参数值是否有正确 /// </summary> public bool CheckParameter(HttpRequestBase request) { var val = request[ParameterName]; bool b = false; if (val == null && ParameterValue == null) b = true; else if (val != null && ParameterValue != null && val == ParameterValue.ToString()) b = true; return b; } }