MVC权限模块
设计方向:
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权限模块的更多相关文章
- Web应用程序系统的多用户权限控制设计及实现-权限模块【10】
前五章均是从整体上讲述了Web应用程序的多用户权限控制实现流程,本章讲述Web权限管理系统的权限配置模块.页面模块涉及到的数据表为权限表.权限配置模块是按照用户组和页面,栏目结合组成的.通过配置一个用 ...
- 开篇ASP.NET MVC 权限管理系列
开篇 [快乐编程系列之ASP.NET MVC 权限管理系列]一.开篇 用了好长一段时间的ASP.NET MVC,感觉MVC真的是很好用,最近一年左右做了两个中小型项目,觉得还是很多地方不是很熟悉的 ...
- asp.net core权限模块的快速构建
大部分系统都会有权限模块,别人家系统的权限怎么生成的我不知道,我只知道这样做是可以并且挺好的. 文章中只对asp.net core的部分代码进行说明 呃 记录~,mvc版本自行前往仓库查阅 代码中的一 ...
- 解析大型.NET ERP系统 权限模块设计与实现
权限模块是ERP系统的核心模块之一,完善的权限控制机制给系统增色不少.总结我接触过的权限模块,以享读者. 1 权限的简明定义 ERP权限管理用一句简单的话来说就是:谁 能否 做 那些 事. 文句 含义 ...
- 从零开始编写自己的C#框架(18)——Web层后端权限模块——菜单管理
从本章开始,主要讲解的是页面中对框架相关功能的调用方法,比如列表页面(又分为有层次感列表和普通列表).编辑页面.多标签页面等,只要熟悉了这些函数的使用方法,那么开发起来就会很便捷了. 1.如图先创建菜 ...
- nopcommerce之权限模块
这篇文章简单介绍一下nopcommerce的权限模块,nopcommerce里面的权限设计相对比较简单,主要针对后台的action和前台的是否显示(比如产品.品牌等),虽然简单但是应付一般的项目应该没 ...
- mvc 权限管理 demo
http://blog.csdn.net/zht666/article/details/8529646 new http://www.cnblogs.com/fengxing/archive/2012 ...
- Extjs4.1.x使用Application动态按需加载MVC各模块
我们知道Extjs4之后提出了MVC模块开发,将以前肥厚的js文件拆分成小的js模块[model\view\controller\store\form\data等],通过controller拼接黏合, ...
- NET MVC异常处理模块
一个简单的ASP.NET MVC异常处理模块 一.前言 异常处理是每个系统必不可少的一个重要部分,它可以让我们的程序在发生错误时友好地提示.记录错误信息,更重要的是不破坏正常的数据和影响系统运行. ...
随机推荐
- [转]NHibernate之旅(10):探索父子(一对多)关联查询
本节内容 关联查询引入 一对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 关联查询引入 在NHibernate中提供了三种查询方式给我们选择:NH ...
- std::move()和std::forward()
std::move(t)负责将t的类型转换为右值引用,这种功能很有用,可以用在swap中,也可以用来解决完美转发. std::move()的源码如下 template<class _Ty> ...
- uvaoj 10397 - Connect the Campus【最小生成树】
uvaoj 10397 - Connect the Campus Many new buildings are under construction on the campus of the Univ ...
- 解决SDK下载时速度过慢的问题
1.打开android sdk manager 2.打开tool->options,如图所示 3.将Proxy Settings 里的HTTP Proxy Server和HTTP Proxy P ...
- 为什么String要设计成不可变的?
英文原:http://www.programcreek.com/2013/04/why-string-is-immutable-in-java/ 转自:http://blog.csdn.net/ren ...
- Android.mk 的含义
LOCAL_PATH:=$(call my-dir) LOCAL_PATH是定义源文件在哪个目录用的. my-dir 是个定义的宏方法, $(call my-dir)就是调用这个叫 my-dir的宏方 ...
- 显示、隐藏 PowerShell
以下是一个快速实现该需求的 module.只要将以下代码复制粘贴到 Documents\WindowsPowerShell\Packages\PowerShell\PowerShell.psm1 即可 ...
- TR069协议向导——一个帮助你了解TR069协议的简明教程(一)
您也能够到下面地址下载: http://download.csdn.net/source/993034 1.为什么须要TR069 随着VoIP.IPTV等越来越多IP终端设备的普及(尤其在家庭中 ...
- BeanUtils使用概要
BeanUtils是apache提供的的一个工具类,在很多地方我们都要用到这个类.下面说说这个类的简单用法. 相关的使用细节已经在代码的注释中说明了. @Test public void test5( ...
- CXF整合Spring开发WebService
刚开始学webservice时就听说了cxf,一直没有尝试过,这两天试了一下,还不错,总结如下: 要使用cxf当然是要先去apache下载cxf,下载完成之后,先要配置环境变量,有以下三步: 1.打开 ...