最近这段时间博客园有几位同学在探讨通用的权限方案,偶闲来无事,也来凑凑热闹,下面简单说一下我的简单解决方案,基于AOP的。由于使用了Asp.Net MVC 开发,可能需要先对MVC有些了解,思路都是差不多的。
1.数据结构
Mad_Popedom为权限表,Control记录控制器名,Action记录动作名。
Mad_Role为角色表。
2.权限控制的实现
此处使用比较简单AOP方式,用MVC的Filter实现,代码如下
1 using System.Collections.Generic;
2 using System.Web.Mvc;
3 using Madnet.Model.MadAdmin;
4 using Madnet.BLL.MadAdmin;
5
6 namespace Madnet.Controllers.MadAdmin
7 {
8 public class SupportFilterAttribute : ActionFilterAttribute
9 {
10 private bool _IsLogin = true;
11 /// <summary>
12 /// 是否需要登录
13 /// </summary>
14 public bool IsLogin
15 {
16 set
17 {
18 _IsLogin = value;
19 }
20 get
21 {
22 if (System.Configuration.ConfigurationManager.AppSettings["IsLogin"] != null)
23 {
24 bool.TryParse(System.Configuration.ConfigurationManager.AppSettings["IsLogin"].ToString(), out _IsLogin);
25 }
26 return _IsLogin;
27 }
28 }
29 public override void OnActionExecuting(ActionExecutingContext filterContext)
30 {
31 string controllerName = (string)filterContext.RouteData.Values["controller"];
32 string actionName = (string)filterContext.RouteData.Values["action"];
33
34 if (IsLogin && filterContext.HttpContext.Session["Login_User"] == null)
35 {
36 filterContext.HttpContext.Response.Redirect(new UrlHelper(filterContext.RequestContext).Action("Login", "Default"));
37 filterContext.Result = new EmptyResult();
38 }
39 else if (IsLogin && filterContext.HttpContext.Session["Login_User"] != null)
40 {
41 Mad_User user = filterContext.HttpContext.Session["Login_User"] as Mad_User;
42 if (!user.is_super)
43 {
44 if (!GetPopedom(user).Exists(p => p.Controller_Name == controllerName.ToLower() && p.Action_Name == actionName.ToLower()))
45 {
46 filterContext.HttpContext.Response.Write("没有权限");
47 filterContext.Result = new EmptyResult();
48 }
49
50 }
51 }
52
53 }