ASP.NET.4.5.1+MVC5.0设置系统角色与权限

这篇文章主要介绍了ASP.NET.4.5.1+MVC5.0设置系统角色与权限的部分内容,后续我们将继续讨论这个话题,希望小伙伴们喜欢。
 
 

数据结构

权限分配

1.在项目中新建文件夹Helpers

2.在HR.Helpers文件夹下添加EnumMoudle.Cs

 代码如下:

namespace HR.Helpers
{
public enum EnumMoudle
{
/// <summary>
/// 模块
/// </summary>
[EnumTitle("用户管理")]
SysUserManage_Role = 102,
[EnumTitle("机构管理")]
Department = 201,
[EnumTitle("人事资料")]
Employees = 301,
[EnumTitle("系统管理")]
BaseInfo = 404,
}
}

 

3.在HR.Helpers文件夹下添加ControllerBase.Cs

 

代码如下:

namespace HR.Helpers
{
public class ControllerBase : Controller
{
/// <summary>
/// 操作人,传IP....到后端记录
/// </summary>
public virtual Operater Operater
{
get
{
return null;
}
}
/// <summary>
/// 分页大小
/// </summary>
public virtual int PageSize
{
get
{
return 15;
}
}
protected ContentResult JsonP(string callback, object data)
{
var json = Newtonsoft.Json.JsonConvert.SerializeObject(data);
return this.Content(string.Format("{0}({1})", callback, json));
}
/// <summary>
/// 当弹出DIV弹窗时,需要刷新浏览器整个页面
/// </summary>
/// <returns></returns>
public ContentResult RefreshParent(string alert = null)
{
var script = string.Format("<script>{0}; parent.location.reload(1)</script>", string.IsNullOrEmpty(alert) ? string.Empty : "alert('" + alert + "')");
return this.Content(script);
}
public new ContentResult RefreshParentTab(string alert = null)
{
var script = string.Format("<script>{0}; if (window.opener != null) {{ window.opener.location.reload(); window.opener = null;window.open('', '_self', ''); window.close()}} else {{parent.location.reload(1)}}</script>", string.IsNullOrEmpty(alert) ? string.Empty : "alert('" + alert + "')");
return this.Content(script);
}
/// <summary>
/// 用JS关闭弹窗
/// </summary>
/// <returns></returns>
public ContentResult CloseThickbox()
{
return this.Content("<script>top.tb_remove()</script>");
}
/// <summary>
/// 警告并且历史返回
/// </summary>
/// <param name="notice"></param>
/// <returns></returns>
public ContentResult Back(string notice)
{
var content = new StringBuilder("<script>");
if (!string.IsNullOrEmpty(notice))
content.AppendFormat("alert('{0}');", notice);
content.Append("history.go(-1)</script>");
return this.Content(content.ToString());
}
public ContentResult PageReturn(string msg, string url = null)
{
var content = new StringBuilder("<script type='text/javascript'>");
if (!string.IsNullOrEmpty(msg))
content.AppendFormat("alert('{0}');", msg);
if (string.IsNullOrWhiteSpace(url))
url = Request.Url.ToString();
content.Append("window.location.href='" + url + "'</script>");
return this.Content(content.ToString());
}
/// <summary>
/// 转向到一个提示页面,然后自动返回指定的页面
/// </summary>
/// <param name="notice"></param>
/// <param name="redirect"></param>
/// <returns></returns>
public ContentResult Stop(string notice, string redirect, bool isAlert = false)
{
var content = "<meta http-equiv='refresh' content='1;url=" + redirect + "' /><body style='margin-top:0px;color:red;font-size:24px;'>" + notice + "</body>";
if (isAlert)
content = string.Format("<script>alert('{0}'); window.location.href='{1}'</script>", notice, redirect);
return this.Content(content);
}
/// <summary>
/// 在方法执行前更新操作人
/// </summary>
/// <param name="filterContext"></param>
public virtual void UpdateOperater(ActionExecutingContext filterContext)
{
if (this.Operater == null)
return;
WCFContext.Current.Operater = this.Operater;
}
public virtual void ClearOperater()
{
//TODO
}
/// <summary>
/// AOP拦截,在Action执行后
/// </summary>
/// <param name="filterContext">filter context</param>
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
if (!filterContext.RequestContext.HttpContext.Request.IsAjaxRequest() && !filterContext.IsChildAction)
RenderViewData();
this.ClearOperater();
}
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
this.UpdateOperater(filterContext);
base.OnActionExecuting(filterContext);
//在方法执行前,附加上PageSize值
filterContext.ActionParameters.Values.Where(v => v is Request).ToList().ForEach(v => ((Request)v).PageSize = this.PageSize);
}
/// <summary>
/// 产生一些视图数据
/// </summary>
protected virtual void RenderViewData()
{
}
/// <summary>
/// 当前Http上下文信息,用于写Log或其他作用
/// </summary>
public WebExceptionContext WebExceptionContext
{
get
{
var exceptionContext = new WebExceptionContext
{
IP = Fetch.UserIp,
CurrentUrl = Fetch.CurrentUrl,
RefUrl = (Request == null || Request.UrlReferrer == null) ? string.Empty : Request.UrlReferrer.AbsoluteUri,
IsAjaxRequest = (Request == null) ? false : Request.IsAjaxRequest(),
FormData = (Request == null) ? null : Request.Form,
QueryData = (Request == null) ? null : Request.QueryString,
RouteData = (Request == null || Request.RequestContext == null || Request.RequestContext.RouteData == null) ? null : Request.RequestContext.RouteData.Values
};
return exceptionContext;
}
}
/// <summary>
/// 发生异常写Log
/// </summary>
/// <param name="filterContext"></param>
protected override void OnException(ExceptionContext filterContext)
{
base.OnException(filterContext);
var e = filterContext.Exception;
LogException(e, this.WebExceptionContext);
}
protected virtual void LogException(Exception exception, WebExceptionContext exceptionContext = null)
{
//do nothing!
}
}
public class WebExceptionContext
{
public string IP { get; set; }
public string CurrentUrl { get; set; }
public string RefUrl { get; set; }
public bool IsAjaxRequest { get; set; }
public NameValueCollection FormData { get; set; }
public NameValueCollection QueryData { get; set; }
public RouteValueDictionary RouteData { get; set; }
}
}

 

4.在项目文件夹中新建ControllerBase.cs

 

代码如下:

namespace HR
{
public abstract class ControllerBase:HR.Helpers.ControllerBase
{
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
}

 

protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
}
}
}

 

5.在项目中新建RoleControllerBase.cs

 

代码如下:

namespace HR
{
public class RoleControllerBase : ControllerBase
{
SystemUserRepository sysuserrepository = new SystemUserRepository();
/// <summary>
/// 用户权限
/// </summary>
public virtual List<EnumMoudle> PermissionList
{
get
{
var permissionList = new List<EnumMoudle>();
return permissionList;
}
}
public string BusinessPermissionString { get; set; }
[NotMapped]
public List<EnumMoudle> BusinessPermissionList
{
get
{
if (string.IsNullOrEmpty(BusinessPermissionString))
return new List<EnumMoudle>();
else
return BusinessPermissionString.Split(",".ToCharArray()).Select(p => int.Parse(p)).Cast<EnumMoudle>().ToList();
}
set
{
BusinessPermissionString = string.Join(",", value.Select(p => (int)p));
}
}
/// <summary>
/// Action方法执行前没有权限提示信息
/// </summary>
/// <param name="filterContext"></param>
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
var noAuthorizeAttributes = filterContext.ActionDescriptor.GetCustomAttributes(typeof(AuthorizeIgnoreAttribute), false);
if (noAuthorizeAttributes.Length > 0)
return;
base.OnActionExecuting(filterContext);
bool hasPermission = true;
var permissionAttributes = filterContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes(typeof(PermissionAttribute), false).Cast<PermissionAttribute>();
permissionAttributes = filterContext.ActionDescriptor.GetCustomAttributes(typeof(PermissionAttribute), false).Cast<PermissionAttribute>().Union(permissionAttributes);
var attributes = permissionAttributes as IList<PermissionAttribute> ?? permissionAttributes.ToList();
if (permissionAttributes != null && attributes.Count() > 0)
{
string cookie = CookieHelper.GetValue("SystemUserID");
if (string.IsNullOrEmpty(cookie))
{
filterContext.Result = Content("您没有登录!");
}
else
{
int mid = int.Parse(CookieHelper.GetValue("SystemUserID"));
var model = sysuserrepository.GetModel(mid);
BusinessPermissionString = model.BusinessPermissionString;
hasPermission = true;
foreach (var attr in attributes)
{
foreach (var permission in attr.Permissions)
{
if (!BusinessPermissionList.Contains(permission))
{
hasPermission = false;
break;
}
}
}
if (!hasPermission)
{
if (Request.UrlReferrer != null)
filterContext.Result = this.Stop("您没有权限!", "/default/ng");
else
filterContext.Result = Content("您没有权限!");
}
}
}
}
}
}

 

6.在每个Controller继承RoleControllerBase类

public class EmployeesController : RoleControllerBase

7.在HR.Helpers文件夹下添加PermissionAttribute.Cs ,并继承 FilterAttribute, IActionFilter

 

代码如下:

namespace HR.Helpers
{
public class PermissionAttribute : FilterAttribute, IActionFilter
{
public List<EnumMoudle> Permissions { get; set; }

 

public PermissionAttribute(params EnumMoudle[] parameters)
{
Permissions = parameters.ToList();
}

public void OnActionExecuted(ActionExecutedContext filterContext)
{
//throw new NotImplementedException();
}

public void OnActionExecuting(ActionExecutingContext filterContext)
{
//throw new NotImplementedException();
}
}
}

 

8.然后在Controller或者Action方法加上验证

 

代码如下:

[Permission(EnumMoudle.Employees),Authorize, ValidateInput(false)]
[Permission(EnumMoudle.SysUserManage_Role)]

 

9.在用户管理Controller中添加权限分配,修改方法

 代码如下:

#region 添加管理员
/// <summary>
/// 添加页
/// </summary>
/// <param name="model">管理员实体类</param>
/// <returns></returns>
[Authorize]
public ActionResult Add()
{
var moudleList = EnumHelper.GetItemValueList<EnumMoudle>();
this.ViewBag.MoudleList = new SelectList(mouldeList, "Key", "Value");
return View();
}
/// <summary>
/// 添加事件
/// </summary>
/// <param name="model">实体类</param>
/// <param name="fc"></param>
/// <returns></returns>
[Authorize, HttpPost, ValidateInput(false)]
public ActionResult Add(SystemUser model, FormCollection fc)
{
model.BusinessPermissionString = fc["MoudelList"];
model.State = 1;
model.CreateTime = DateTime.Now;
systemuserrepository.SaveOrEditModel(model);
return RedirectToAction("UserList");
}
#endregion
//修改权限
[Authorize, AcceptVerbs(HttpVerbs.Post), ValidateInput(false)]
public ActionResult Edit(int id, FormCollection fc)
{
var model = systemuserrepository.GetModel(id);
if (model != null)
{
string password = model.PassWord;
if (Request.Form["PassWord"] != "")
{
model.BusinessPermissionString = fc["MoudleList"];
UpdateModel(model);
systemuserrepository.SaveOrEditModel(model);
}
else
{
model.BusinessPermissionString = fc["MoudleList"];
UpdateModel(model);
model.PassWord = password;
systemuserrepository.SaveOrEditModel(model);
}
return RedirectToAction("userlist");
}
else
return View("404");
}
#endregion

 代码如下:

[Authorize]
public ActionResult Edit(int id)
{
var model = systemuserrepository.GetModel(id);
if (model != null)
{
var moudleList = EnumHelper.GetItemValueList<EnumBusinessPermission>();
this.ViewBag.MoudleList = new SelectList(moudleList, "Key", "Value", string.Join(",", model.BusinessPermissionString.ToString()));
return View(model);
}
else
return View("404");
}

 

以上就是本文的全部内容了,后续我们将持续更新,小伙伴们是否喜欢本系列文章呢?

时间: 2025-01-26 17:32:48

ASP.NET.4.5.1+MVC5.0设置系统角色与权限的相关文章

ASP.NET.4.5.1+MVC5.0设置系统角色与权限(二)_实用技巧

系统角色篇 数据结构 用户管理 Controller代码 复制代码 代码如下: public class SystemUserController : Controller     {         //public void Log()         //{         //    string meg = "";         //    int user = int.Parse(CookieHelper.GetValue("SysUserID"));

ASP.NET.4.5.1+MVC5.0设置系统角色与权限(一)_实用技巧

数据结构 权限分配 1.在项目中新建文件夹Helpers 2.在HR.Helpers文件夹下添加EnumMoudle.Cs 复制代码 代码如下: namespace HR.Helpers {     public enum EnumMoudle     {         /// <summary>         /// 模块         /// </summary>         [EnumTitle("用户管理")]         SysUserM

使用ASP.NET.4.5.1+MVC5.0 搭建一个包含 Ninject框架 项目

这篇文章主要介绍了使用ASP.NET.4.5.1+MVC5.0 搭建一个包含 Ninject框架 项目的方法,需要的朋友可以参考下 1.创建一个空白解决方案 2.添加一个类库 名称为XXX.Domain 3.添加一个ASP.MVC 名称为XXX.WebUI 4.选着空模版,勾选MVC核心引用 5.添加单元测试项目 XXX.UntiTests 6.在程序包控制台里面输入以下代码 复制代码 代码如下: Install-Package Ninject -version 3.0.1.10 -projec

asp.net 关于form认证的一般设置

asp.net asp.net 关于form认证的一般设置: 1: 在web.config中,加入form认证: <authentication mode="Forms"> <forms name="auth" loginUrl="index.aspx" timeout="30"></forms> </authentication> <authorization> &

ASP.NET MVC 5-开始MVC5之旅

原文:ASP.NET MVC 5-开始MVC5之旅 本教程将使用Visual Studio 2013手把手教你构建一个入门的ASP.NET MVC5 Web应用程序.本教程配套的C#源码工程可通过如下网址下载:C#版本源码链接.同时,请查阅 Building the Chapter Downloads 来完成编译源码和配置数据库. 在本教程中的源码工程,您可在Visual Studio中运行MVC 5应用程序.您也可以使Web应用程序部署到一个托管服务提供商上.微软提供免费的网络托管多达10个网

在asp.net中 判断不能小于0 大于360的 判断方法 正则表达式也行

问题描述 在asp.net中 判断不能小于0 大于360的 判断方法 正则表达式也行 在asp.net中 判断不能小于0 大于360的 判断方法 正则表达式也行 解决方案 string s = "123"; int i = int.Parse(s); if (i >= 0 && i <= 360) ... 正则 (d{1,2})|([1-2]d{2})|(3[1-5]d)|(360) 解决方案二: 范围: 0<i<360 var reg=/^((

CI框架3.0设置默认控制器

问题描述 CI框架3.0设置默认控制器 请教一下:为什么在CI框架3.0中设置默认控制器不能这样写啊,页面显示The page you requested was not found? 解决方案 http://blog.sina.com.cn/s/blog_a77576280102vau3.html

com-vb6.0设置921600波特率设置问题

问题描述 vb6.0设置921600波特率设置问题 vb6.0可以设置921600波特率设置问题吗?怎么设置,如果不能,别的什么软件可以呢 解决方案 不能设置,最高只能设置56K.别的软件也不行,除非你写驱动,看你的串口本身有没有这样的驱动支持.

android百度地图3.0 设置多个覆盖物后如何自动缩放显示所有覆盖物

问题描述 android百度地图3.0 设置多个覆盖物后如何自动缩放显示所有覆盖物 android百度地图3.0 设置多个覆盖物后,地图显示不全所有的覆盖物,如何一进去地图就能自动缩放显示所有的覆盖物 解决方案 使用OverlayManager类中的 ** zoomToSpan();**//缩放地图,使所有overlay都在合适的视野内.**该方法只对Marker类型的overlay有效** 方法. 你需要重写PoiOverlay继承与OverlayManager.实现里面的方法. 然后调用zo