今天把用户的菜单显示和页面的按钮显示都做好了,下面先来个效果图

接下来说下我实现的方法:

首先我在每个方法前面都加了这个属性,

    /// <summary>
/// 表示当前Action请求为一个具体的功能页面
/// </summary>
public class AdminActionMethod : Attribute {
/// <summary>
/// 页面请求路径
/// </summary>
public string ActionUrl { get; set; }
/// <summary>
/// 页面操作代码
/// </summary>
public string RoleCode { get; set; }
/// <summary>
/// 页面返回类型(0:返回页面,1返回json格式)
/// </summary>
public int ActionResultType { get; set; }
}

当不需要验证的时候只要设置RoleCode="NoNeedAuthory"就行。

然后每次在执行方法之间都会进入到

    public class AdminAuthory : ActionFilterAttribute {
public override void OnActionExecuting(ActionExecutingContext filterContext) {
//用MVC系统自带的功能 获取当前方法上的特性名称
bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(NoNeedAdminAuthory), inherit: true)
|| filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(NoNeedAdminAuthory), inherit: true);
if (skipAuthorization) {
return;
}
//检查是否登录
if (!WebCookieHelper.AdminCheckLogin()) {
filterContext.Result = new RedirectResult("~/Admin/Account/Login", true);
return;
}
//如果是超级管理就免去验证
if (WebCookieHelper.GetAdminId() == ) {
return;
}
//页面权限验证开始
var customAttributes = filterContext.ActionDescriptor.GetCustomAttributes(true);
if (customAttributes != null && customAttributes.Length > ) {
for (int i = ; i < customAttributes.Count(); i++) {
if (customAttributes.GetValue(i).GetType().Name == "AdminActionMethod") {//判断anction特性名称
string actionCode = (customAttributes[i] as AdminActionMethod).RoleCode;//获取特性功能按钮代码
string actionUrl = (customAttributes[i] as AdminActionMethod).ActionUrl;//获取特性功能地址
int actionResultType = (customAttributes[i] as AdminActionMethod).ActionResultType;//获取返回视图类型
if (actionCode == "NoNeedAuthory") {//不需要权限认证
return;
}
else { //判断权限是否符合
List<AuthorDesign.Model.AdminPageAction> pageActionList = AdminMenuHelper.GetNowAdminMenu();
var pageSelect = pageActionList.Where(m => m.PageUrl == actionUrl);
if (pageSelect != null && pageSelect.Count() > ) { //判断有无执行该页面的权利
//判断有误执行该动作权利
var codeList = AdminMenuHelper.LoadActionCodeList();
//先根据动作按钮代码查找到代码所在按钮Id
var codeSelect = codeList.Where(m => m.ActionCode == actionCode);
if (codeSelect != null && codeSelect.Count() > ) {
int codeId = codeSelect.First().Id;
JavaScriptSerializer serializer = new JavaScriptSerializer();
//判断codeId在角色动作列表中是否为选择状态
string roleActionList = pageSelect.First().RoleActionList; List<AuthorDesign.Web.Areas.Admin.Models.RolePageActionModel> roleActionListModel = serializer.Deserialize<List<AuthorDesign.Web.Areas.Admin.Models.RolePageActionModel>>(roleActionList);
if (roleActionListModel != null && roleActionListModel.Where(m => m.ActionId == codeId && m.actionChecked == ).Count() > ) {
//判断CodeId在管理员动作列表中是否为选择状态
List<AuthorDesign.Web.Areas.Admin.Models.RolePageActionModel> adminActionListModel = serializer.Deserialize<List<AuthorDesign.Web.Areas.Admin.Models.RolePageActionModel>>(pageSelect.First().AdminActionList);
if (adminActionListModel != null && adminActionListModel.Where(m => m.ActionId == codeId && m.actionChecked == ).Count() > ) {
StringBuilder sb = new StringBuilder();
sb.Append("[");
//传递在该页面可执行的按钮
foreach (var item in roleActionListModel) {
if (item.actionChecked == ) {
var needChangeAction = adminActionListModel.Where(m => m.ActionId == item.ActionId).FirstOrDefault();
if (needChangeAction == null) {
item.actionChecked = ;
}
else if (needChangeAction.actionChecked == ) {
item.actionChecked = ;
}
}
AuthorDesign.Model.PageAction OneAction = codeList.Where(m => m.Id == item.ActionId).FirstOrDefault();
sb.Append("{").Append("\"").Append("ActionName").Append("\"").Append(":").Append("\"").Append(OneAction == null ? "" : OneAction.ActionCode).Append("\"").Append(",").Append("\"").Append("IsChecked").Append("\"").Append(":").Append(item.actionChecked).Append("}").Append(","); }
sb.Remove(sb.Length - , );
sb.Append("]");
filterContext.Controller.ViewBag.CanOperationActionList = sb.ToString();
}
else {
if (actionResultType == ) {
filterContext.Result = new RedirectResult("~/Admin/Home/NoAuthory", true);
}
else if (actionResultType == ) {
filterContext.Result = new JsonResult() { Data = new { state = "error", message = "您暂无权限操作" } };
}
return;
}
}
else {
if (actionResultType == ) {
filterContext.Result = new RedirectResult("~/Admin/Home/NoAuthory", true);
}
else if (actionResultType == ) {
filterContext.Result = new JsonResult() { Data = new { state = "error", message = "您暂无权限操作" } };
}
return;
} }
else {
if (actionResultType == ) {
filterContext.Result = new RedirectResult("~/Admin/Home/NoAuthory", true);
}
else if (actionResultType == ) {
filterContext.Result = new JsonResult() { Data = new { state = "error", message = "您暂无权限操作" } };
}
return;
}
}
else {
if (actionResultType == ) {
filterContext.Result = new RedirectResult("~/Admin/Home/NoAuthory", true);
}
else if (actionResultType == ) {
filterContext.Result = new JsonResult() { Data = new { state = "error", message = "您暂无权限操作" } };
}
return;
}
}
}
}
} base.OnActionExecuting(filterContext);
}
}
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class NoNeedAdminAuthory : Attribute {
}

这是MVC的机制,这个方法是重写了执行方法之前的这个方法,不过需要在控制器上或者方法上加上下面这个代码

那么接下来就说下我的判断思路:

//检查是否登录
if (!WebCookieHelper.AdminCheckLogin()) {
filterContext.Result = new RedirectResult("~/Admin/Account/Login", true);
return;
}

这是用来先检测下用户是否登录,如果没有登录则直接回到登录页面,

 //如果是超级管理就免去验证
if (WebCookieHelper.GetAdminId() == ) {
return;
}

这是如果进来的用户是超级管理员那么就直接显示要显示的页面页面即可,左边菜单栏晚点讲。

//页面权限验证开始
var customAttributes = filterContext.ActionDescriptor.GetCustomAttributes(true);
if (customAttributes != null && customAttributes.Length > ) {
for (int i = ; i < customAttributes.Count(); i++) {
if (customAttributes.GetValue(i).GetType().Name == "AdminActionMethod") {//判断anction特性名称
string actionCode = (customAttributes[i] as AdminActionMethod).RoleCode;//获取特性功能按钮代码
string actionUrl = (customAttributes[i] as AdminActionMethod).ActionUrl;//获取特性功能地址
int actionResultType = (customAttributes[i] as AdminActionMethod).ActionResultType;//获取返回视图类型

利用这个来抓取用户当前要执行的方法,然后对其作出相应的处理,

 List<AuthorDesign.Model.AdminPageAction> pageActionList = AdminMenuHelper.GetNowAdminMenu();

这行代码用来加载当前要显示的全部页面

        /// <summary>
/// 获取管理员可操作菜单列表
/// </summary>
/// <param name="adminId">管理员Id</param>
/// <returns></returns>
public static List<Model.AdminPageAction> GetAdminMenu(int adminId) {
if (CacheHelper.IsExistCache("AdminMenuList")) {
Dictionary<int, List<Model.AdminPageAction>> adminMenuListDic = CacheHelper.GetCache("AdminMenuList") as Dictionary<int, List<Model.AdminPageAction>>;
List<Model.AdminPageAction> adminMenuList = adminMenuListDic[adminId];
if (adminMenuList == null) {
adminMenuList = EnterRepository.GetRepositoryEnter().GetPageMenuRepository.GetAdminShowPage(adminId);
adminMenuListDic.Add(adminId, adminMenuList);
CacheHelper.AddCache("AdminMenuList", adminMenuListDic, );
}
return adminMenuList;
}
else {
List<Model.AdminPageAction> adminMenuList = EnterRepository.GetRepositoryEnter().GetPageMenuRepository.GetAdminShowPage(adminId);
Dictionary<int, List<Model.AdminPageAction>> adminMenuListDic = new Dictionary<int, List<Model.AdminPageAction>>();
adminMenuListDic.Add(adminId, adminMenuList);
CacheHelper.AddCache("AdminMenuList", adminMenuListDic, );
return adminMenuList;
}
//if (CacheHelper.IsExistCache("AdminMenuList_"+adminId)) {
// return CacheHelper.GetCache("AdminMenuList_" + adminId) as List<Model.AdminPageAction>;
//}
//else {
// List<Model.AdminPageAction> adminMenuList = EnterRepository.GetRepositoryEnter().GetPageMenuRepository.GetAdminShowPage(adminId);
// CacheHelper.AddCache("AdminMenuList_" + adminId, adminMenuList, 1);
// return adminMenuList;
//}
//return EnterRepository.GetRepositoryEnter().GetPageMenuRepository.GetAdminShowPage(adminId);
}
/// <summary>
/// 获取当前管理员可操作菜单列表(超级管理员另取)
/// </summary>
/// <returns></returns>
public static List<Model.AdminPageAction> GetNowAdminMenu() {
return GetAdminMenu(WebCookieHelper.GetAdminId());
}

这里我用缓存做了下处理,不知道处理的好不好,还望你们指点我一下。

 var pageSelect = pageActionList.Where(m => m.PageUrl == actionUrl);
if (pageSelect != null && pageSelect.Count() > ) { //判断有无执行该页面的权利

这个是用来判断当前执行的方法是否在全部要显示的页面之中,如果不是则直接输出,是的话继续往下走。

 //判断有误执行该动作权利
var codeList = AdminMenuHelper.LoadActionCodeList();
//先根据动作按钮代码查找到代码所在按钮Id
var codeSelect = codeList.Where(m => m.ActionCode == actionCode);
if (codeSelect != null && codeSelect.Count() > ) {
int codeId = codeSelect.First().Id;
JavaScriptSerializer serializer = new JavaScriptSerializer();
//判断codeId在角色动作列表中是否为选择状态
string roleActionList = pageSelect.First().RoleActionList;

这里是先判断了当前执行的方法按钮是否在该管理员所属的角色 可操作的按钮之中,不是的话直接输出,如果是的话则继续往下走。

 List<AuthorDesign.Web.Areas.Admin.Models.RolePageActionModel> roleActionListModel = serializer.Deserialize<List<AuthorDesign.Web.Areas.Admin.Models.RolePageActionModel>>(roleActionList);
if (roleActionListModel != null && roleActionListModel.Where(m => m.ActionId == codeId && m.actionChecked == ).Count() > ) {
//判断CodeId在管理员动作列表中是否为选择状态
List<AuthorDesign.Web.Areas.Admin.Models.RolePageActionModel> adminActionListModel = serializer.Deserialize<List<AuthorDesign.Web.Areas.Admin.Models.RolePageActionModel>>(pageSelect.First().AdminActionList);
if (adminActionListModel != null && adminActionListModel.Where(m => m.ActionId == codeId && m.actionChecked == ).Count() > ) {
StringBuilder sb = new StringBuilder();
sb.Append("[");
//传递在该页面可执行的按钮
foreach (var item in roleActionListModel) {
if (item.actionChecked == ) {
var needChangeAction = adminActionListModel.Where(m => m.ActionId == item.ActionId).FirstOrDefault();
if (needChangeAction == null) {
item.actionChecked = ;
}
else if (needChangeAction.actionChecked == ) {
item.actionChecked = ;
}
}
AuthorDesign.Model.PageAction OneAction = codeList.Where(m => m.Id == item.ActionId).FirstOrDefault();
sb.Append("{").Append("\"").Append("ActionName").Append("\"").Append(":").Append("\"").Append(OneAction == null ? "" : OneAction.ActionCode).Append("\"").Append(",").Append("\"").Append("IsChecked").Append("\"").Append(":").Append(item.actionChecked).Append("}").Append(","); }
sb.Remove(sb.Length - , );
sb.Append("]");
filterContext.Controller.ViewBag.CanOperationActionList = sb.ToString();

这部分就是主要用来判断当前执行的方法是否在该管理员可执行的按钮之中,如果在的话那么将改页面的按钮以及是否可操作状态通过ViewBag进行传到前台,然后前台利用Js来移除相对应的不显示按钮。

左边的菜单按钮部分待会上源码自己去看下吧

那么简单的用户角色权限管理在这里就可以结束了。但是我发现有个问题,我也不知道是为什么:看下面

就是我用火狐的时候,发现点击某些链接的时候会不经过那个action的方法,直接跳到登录页面,这是为什么,我碰到好几次了,求帮忙解决下。

百度源码下载地址

github地址:https://github.com/yjqGitHub/AuthoryDesign

有什么地方写的不好的还希望大家都指出来啊

Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理10的更多相关文章

  1. Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理

    这是本人第一次写,写的不好的地方还忘包含.写这个的主要原因是想通过这个来学习下EF的CodeFirst模式,本来也想用AngularJs来玩玩的,但是自己只会普通的绑定,对指令这些不是很熟悉,所以就基 ...

  2. Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理4

    首先先加个区域,名为Admin using System.Web.Mvc; namespace AuthorDesign.Web.Areas.Admin { public class AdminAre ...

  3. Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理9

    前两天因有事就没来得及写.今天刚刚好空了.这次写的是对角色和管理员对页面按钮之间的控制.先看页面效果 说明:先根据角色设置好角色的权限,然后管理员在对应的角色下的权限去设置其权限. 在设置角色权限的时 ...

  4. Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理6

    接下来先做角色这一板块的(增删改查),首先要新建一个Role控制器,在添加一个RoleList的视图.表格打算采用的是bootstrap的表格. using System; using System. ...

  5. Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理5

    我们先直接拷贝下blank.html这个页面的代码,顺带先建立一个Home控制器,并添加Index视图.将代码拷贝进去. <!DOCTYPE html> <html lang=&qu ...

  6. Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理7

    做完角色之后接下来做先做页面按钮的增加.删除.修改.这里用到的功能和角色那边是一样的.就不多说了.直接上代码. 后台控制器代码 using AuthorDesign.Web.App_Start.Com ...

  7. Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理8

    接下来做的是对页面的增删改查与页面与页面按钮之间的联系.先上代码和页面效果 using AuthorDesign.Web.App_Start.Common; using System; using S ...

  8. Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理1

    首先给上项目的整体框架图:,这里我没有使用BLL,因为感觉太烦了就没有去使用. 那么接下来我们首先先去Model层中添加Model. 管理员类: using System; using System. ...

  9. Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理3

    首先在webconfig中加入下面这句代码,这个主要是用来生成数据库的连接字符串 <connectionStrings> <add name="AuthorDesignCo ...

随机推荐

  1. DotNet的JSON序列化与反序列化

    JSON(JavaScript Object Notation)JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式.在现在的通信中,较多的采用JSON数据格式,JSON有 ...

  2. ASP.NET 实现站内信功能(点对点发送,管理员群发)

    正好这段时间在研究这个功能,还是得感谢这位大神,没有他的引路,我就不可能把站内信做出来. http://www.cnblogs.com/grenet/archive/2010/03/08/168065 ...

  3. 初次体验百度eCharts遇到的问题和解决方法

    前言 上周在厌烦Highchart下,体验了下百度的eCharts,支持IE6.7.8+外,对数据在线编辑还有工具栏支持,体验时遇到了几个小问题,最近两天在尝试得到了一个解决方法. Tooltip时单 ...

  4. 【字符编码】字符编码 && Base64编码算法

    一.前言 在前面的解决乱码的一文中,只找到了解决办法,但是没有为什么,说白了,就是对编码还是不是太熟悉,编码问题是一个很简单的问题,计算机从业人员应该也必须弄清楚,基于编码的应用有Base64加密算法 ...

  5. Bootstrap 3.0正式版发布!

    Bootstrap是Twitter推出的一个开源的用于前端开发的工具包,包含了丰富的Web组件.根据这些组件,开发者可以快速的搭建一个漂亮.功能完备的网站.在经过Bootstrap 3 RC版的测试和 ...

  6. Moon.Orm版本维护及下载(跟踪报道)

    提示:最下面有最新的下载地址  历史记录: ).-- :: 支持Mysql,Sqlserver(点击下载) ).2013年9月14日,代码重构,加入oracle.复合主键功能(点击下载) )--,为d ...

  7. MVC学习系列12---验证系列之Fluent Validation

    前面两篇文章学习到了,服务端验证,和客户端的验证,但大家有没有发现,这两种验证各自都有弊端,服务器端的验证,验证的逻辑和代码的逻辑混合在一起了,如果代码量很大的话,以后维护扩展起来,就不是很方便.而客 ...

  8. git学习之冲突解决办法

    1.如果本地项目和远程服务器的同一文件都有改动,那么就会产生冲突,导致git pull 失败,报错见下. 解决办法:先执行git stash指令,暂存当前的改动状态,再执行git pull指令,就可以 ...

  9. @Html.Raw显示一张图片

    在ASP.NET MVC中,显示一张图片,是很方便的事情,完全可以在控制器中组合html代码,并传给视图. 下面一个简单的例子: public ActionResult HtmlRawImage() ...

  10. javascript超过容器后显示省略号效果(兼容一行或者多行)

    javascript超过容器后显示省略号效果       在实际的项目中,由于文字内容的长度不确定性和页面布局的固定性,难免会出现文字内容超过div(或其他标签,下同)区域的情况,此时比较好的做法就是 ...