在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;
    }
}
View Code

相关文章: