设计方向:

1.摒弃SiteMap,避免在容易书写错误的sitemap中书写,导航在controller和action上打标签生成。

2.controller统一继承basecontroller,在basecontroller上统一权限拦截。

3.使用缓存保存权限列表,避免反复读取数据库。

4.使用Elinq作为ORM工具

5.使用页面部分试图权限

一. 获取权限视图缓存列表

        /// <summary>
        /// 获取权限视图缓存列表
        /// </summary>
        /// <returns></returns>
        public static List<AuthModel> GetAuthCache()
        {
            List<AuthModel> viewRoleGroup;
            string key = "ViewAuthList";
            if (HttpRuntime.Cache[key] != null)
            {
                viewRoleGroup = (List<AuthModel>)HttpRuntime.Cache[key];
            }
            else
            {
                viewRoleGroup = ElinqHelper.List<AuthModel>().Where(p => p.ID > ).ToList();
            }
            return viewRoleGroup; }

二.权限判断业务逻辑

   //权限判断业务逻辑
        protected virtual bool AuthorizeCore(ActionExecutingContext filterContext, bool isViewPage)
        {
            HttpCookie cookie = System.Web.HttpContext.Current.Request.Cookies.Get("userCookie");
            if (cookie != null)
            {
                HttpContext.Current.Session["name"] = cookie.Values["name"];
                HttpContext.Current.Session["zu"] = cookie.Values["zu"];
            }             if (HttpContext.Current.Session["name"] == null) return false;
            if (HttpContext.Current.Session["name"].ToString() == "admin") return true;
            if (filterContext.HttpContext == null) throw new ArgumentNullException("httpContext");
            var controllerName = filterContext.RouteData.Values["controller"].ToString();
            var actionName = filterContext.RouteData.Values["action"].ToString();             var list = GetCache.GetAuthCache();
            var grouplist = list.FirstOrDefault(p => p.CONTROLLERNAME == controllerName && p.ACTIONNAME == actionName).GROUPISLIST;
            var group = Convert.ToDecimal(HttpContext.Current.Session["zu"]);
            if (grouplist.Contains(group))return true;
            return false; }

三.权限拦截

    [newAuthorizeFilterAttribute]
    public class BaseController : Controller
    {
        protected override void OnException(ExceptionContext filterContext)
        {
            filterContext.Controller.ViewData["ErrorMessage"] = filterContext.Exception.Message;
            filterContext.Result = new ViewResult()
            {
                ViewName = "Error",
                ViewData = filterContext.Controller.ViewData,
            };
            filterContext.ExceptionHandled = true;
        } } 

四.更新权限列表

        [Description("更新权限列表")]
        public ActionResult UpAuthList()
        {
            var count = ;
            var result = GetActionPermission.GetAllActionByAssembly().Where(p => !(p.ActionMethod is HttpPostAttribute));
            var dbConfiguration = ElinqHelper.dbConfiguration;
            ElinqHelper.AddClass<AuthModel>();
            using (var ctx = dbConfiguration.CreateDbContext())
            {
                var q = ctx.Set<AuthModel>();
                var sqlResult = q.Where(p => p.ID > );
                foreach (var item in result)
                {
                    var newId = ElinqHelper.NextVal("SQ_AUTH");
                    var auth = sqlResult.FirstOrDefault(p => p.CONTROLLERNAME == item.ControllerName
                        && p.ACTIONNAME == item.ActionName);
                    if (auth != null)
                    {
                        if (string.IsNullOrEmpty(auth.CONTROLLERNAME) || string.IsNullOrEmpty(auth.ACTIONNAME)) break;
                        if (auth.DESCRIPTION != item.Description)
                        {
                            if (q.Update(new { DESCRIPTION = item.Description, LASTTIME = DateTime.Now }, p => p.ID == auth.ID) > ) count++;
                        }
                    }
                    else
                    {
                        AuthModel model = new AuthModel
                        {
                            ID = newId,
                            CONTROLLERNAME = item.ControllerName,
                            ACTIONNAME = item.ActionName,
                            DESCRIPTION = item.Description,
                            LASTTIME = DateTime.Now
                        };
                        if (q.Insert(model) > )
                        {
                            newId++;
                            count++;
                        }
                    }
                }
            }
            return Content("成功更新" + count.ToString() + "个");}

五.导航

public static MvcHtmlString GetWebPath(this HtmlHelper html, string itemTemplate)
        {
            var sb = new StringBuilder();
            var controllerList = GetCache.GetControllerCache();
            var menu = GetCache.GetActionCache()
              .Where(p => p.Attrs.Count(q => q.TypeId.ToString() == "MvcApplication.Controllers.Menu") > );             CurrentUser currentuser = new CurrentUser();
            if (currentuser.ActionPermission == null)
                return MvcHtmlString.Create(sb.ToString());             foreach (var controller in controllerList)
            {
                if (currentuser.ActionPermission != null)
                {
                    var list = currentuser.ActionPermission.Where(p => p.CONTROLLERNAME == controller.ControllerName && p.CONTROLLERNAME != "Home");
                    foreach (var item in list)
                    {
                        var result = menu.FirstOrDefault(p => p.ActionName == item.ACTIONNAME && p.ControllerName == item.CONTROLLERNAME);
                        if (result != null)
                        {
                            sb.Append(itemTemplate.Replace("{0}", result.ControllerName).Replace("{1}", result.ActionName).Replace("{2}",
                                controller.Description));
                            break;
                        }
                    }
                }
            }
            return MvcHtmlString.Create(sb.ToString());}

六.页面代码块级权限设计

public static HelperResult RoleHtmlTags(this HtmlHelper htmlHelper, string action, Func<string, HelperResult> template)        {            var controller = HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString();            CurrentUser currentuser = new CurrentUser();            var auth = currentuser.ActionPermission.Count(p => p.CONTROLLERNAME == controller && p.ACTIONNAME == action);            if (auth > 0)            {                return new HelperResult(writer =>                {                    writer.Write(template.Invoke(null));                });            }            else            {                return null;            }        }

页面使用方法

@Html.RoleHtmlTags("WorkLogEdit", @<span>@Html.ActionLink("编辑", "WorkLogEdit", new { id = dt.id })<span>|</span></span>) 

MVC权限模块的更多相关文章

  1. Web应用程序系统的多用户权限控制设计及实现-权限模块【10】

    前五章均是从整体上讲述了Web应用程序的多用户权限控制实现流程,本章讲述Web权限管理系统的权限配置模块.页面模块涉及到的数据表为权限表.权限配置模块是按照用户组和页面,栏目结合组成的.通过配置一个用 ...

  2. 开篇ASP.NET MVC 权限管理系列

    开篇 [快乐编程系列之ASP.NET MVC 权限管理系列]一.开篇   用了好长一段时间的ASP.NET MVC,感觉MVC真的是很好用,最近一年左右做了两个中小型项目,觉得还是很多地方不是很熟悉的 ...

  3. asp.net core权限模块的快速构建

    大部分系统都会有权限模块,别人家系统的权限怎么生成的我不知道,我只知道这样做是可以并且挺好的. 文章中只对asp.net core的部分代码进行说明 呃 记录~,mvc版本自行前往仓库查阅 代码中的一 ...

  4. 解析大型.NET ERP系统 权限模块设计与实现

    权限模块是ERP系统的核心模块之一,完善的权限控制机制给系统增色不少.总结我接触过的权限模块,以享读者. 1 权限的简明定义 ERP权限管理用一句简单的话来说就是:谁 能否 做 那些 事. 文句 含义 ...

  5. 从零开始编写自己的C#框架(18)——Web层后端权限模块——菜单管理

    从本章开始,主要讲解的是页面中对框架相关功能的调用方法,比如列表页面(又分为有层次感列表和普通列表).编辑页面.多标签页面等,只要熟悉了这些函数的使用方法,那么开发起来就会很便捷了. 1.如图先创建菜 ...

  6. nopcommerce之权限模块

    这篇文章简单介绍一下nopcommerce的权限模块,nopcommerce里面的权限设计相对比较简单,主要针对后台的action和前台的是否显示(比如产品.品牌等),虽然简单但是应付一般的项目应该没 ...

  7. mvc 权限管理 demo

    http://blog.csdn.net/zht666/article/details/8529646 new http://www.cnblogs.com/fengxing/archive/2012 ...

  8. Extjs4.1.x使用Application动态按需加载MVC各模块

    我们知道Extjs4之后提出了MVC模块开发,将以前肥厚的js文件拆分成小的js模块[model\view\controller\store\form\data等],通过controller拼接黏合, ...

  9. NET MVC异常处理模块

    一个简单的ASP.NET MVC异常处理模块   一.前言 异常处理是每个系统必不可少的一个重要部分,它可以让我们的程序在发生错误时友好地提示.记录错误信息,更重要的是不破坏正常的数据和影响系统运行. ...

随机推荐

  1. POJ 3107

    #include<iostream> #include<cstdio> #include<cstring> #include<string> #incl ...

  2. DHU-1241 Oil Deposits

    Oil Deposits Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  3. Color

    http://poj.org/problem?id=2154 题意:经典polya题 解析:差别就是项链数目不定,采用欧拉函数,求出所有情况求解即可 // File Name: poj2154.cpp ...

  4. SSM拦截器应用

    1.创建工具包 2.编写拦截器业务逻辑类容(在此为验证登录效果) @Override public void doFilter(ServletRequest req, ServletResponse ...

  5. 深入理解Objective-C:优化你的代码

    开篇 只要用到Objective-C,我们每天都会跟方法调用打交道.我们都知道Objective-C的方法决议是动态的,但是在底层一个方法究竟是怎么找到的,方法缓存又是怎么运作的却鲜为人知. 本文主要 ...

  6. Pgsql数据库jsonb操作函数集合

    CREATE OR REPLACE FUNCTION "json_object_del_path"( "json" json, "key_path&q ...

  7. 利用WinDriver开发PCI设备驱动程序

    摘要 WinDriver是Jungo公司出版的一个设备驱动程序开发组件,它可以大大加速PCI设备驱动程序的开发.作者在实际的项目中采用了WinDriver来开发设备驱动程序,取得了相当好的运行效果.从 ...

  8. JQuery Kendo UI使用技巧总结

    Kendo UI开发总结 By Gloomyfish on 2013-04-25 在Grid中支持分页刷新:            scrollable: {virtual : true }, 在Gr ...

  9. 以色列学生---debugger 构建

    http://eli.thegreenplace.net/2011/01/23/how-debuggers-work-part-1 http://eli.thegreenplace.net/

  10. careercup-链表 2.1

    2.1 编写代码,移除未排序链表中的重复节点. 不使用临时缓存: 如果不允许使用临时的缓存(即不能使用额外的存储空间),那需要两个指针, 当第一个指针指向某个元素时,第二个指针把该元素后面与它相同的元 ...