C#使⽤Attribute和FilterConfig实现权限验证
使⽤Attribute和FilterConfig实现权限验证,和各种拦截
1.⾸先,新建⼀个⾃定义特性CheckAttribute`
//此特性是约束⾃定义特性的使⽤⽅式。这⾥约束只能在⽅法上使⽤此特性
[AttributeUsage(AttributeTargets.Method)]
public class CheckAttribute : Attribute
{
四有
public CheckAttribute(int PermissionsID)
{
this.PermissionsID = PermissionsID;
}
public int PermissionsID { get; t; }
}
这⾥⽰例上的AttributeUsage是约束⾃定义特性所能使⽤的地⽅,这⾥约束的是只能标记在⽅法上。
2. 再写⼀个CustomerFilterAttribute类继承ActionFilterAttribute,根据需要重写ActionFilterAttribute类⾥的⽅法
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//获取当前⽅法上的所有⾃定义特性,fal表⽰不递归查找
object[] objs = filterContext.ActionDescriptor.GetCustomAttributes(fal);
//循环所有特性
foreach (object item in objs)
{
//如果此特性是我需要的(CheckAttribute)特性
if (item is CheckAttribute)
{
//强制转换成特性的对象(特性就是⼀个⽐较特殊的类,本质上还是类)
CheckAttribute attr = (CheckAttribute)item;
//下⾯可以对特性的数据做⼀些校验,⽐如:校验此⽅法需要什么样的权限才可以访问,校验请求端的IP地址是否在⽩名单等
if (attr.PermissionsID != 13)
{
//如果此⽅法没有13号权限则跳转提⽰页⾯,这⾥判断的逻辑等,都看业务的需求!!
var _respon = filterContext.HttpContext.Respon;
_respon.Redirect("~/Error.html");
}
}
奴役之路
}
}
3. 将CustomerFilterAttribute注册到筛选器中
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
//注册筛选器
filters.Add(new CustomerFilterAttribute());
文学作品分类}
}
4. 剩下的就是标记特性了。
有名小说public class HomeController : Controller
八上数学作业本答案{
[CheckAttribute(12)]
public ActionResult Index()
{
return View();
}
[CheckAttribute(13)]
public ActionResult About()
{
return View();
}
public ActionResult Contact()
{世界女首富
狗哭是什么征兆
return View();
}
}
中国电信是国企还是央企就这个⽰例代码⽽⾔,Index⽅法会⾃动跳转到提⽰的HTML页⾯,About却可以正常运⾏。就此这个简单的权限就完成了!