在系统开发的时候一个老生常谈的权限管理问题,翻阅了很多的网络资料,但是总感觉离实际使用还有一段距离,其实权限控制无非就几个“请求、页面按钮、字段显示”, 对于前端权限就需要配合JS了, 这里主要展示我这些年来一直使用的一个关于权限管理的案例,如果你只是写一个简单的CMS系统,那么下面代码其实拷贝就可以用了,如果是需要进行较大型系统开发就需要进一步封装, 下面是我的思路,写的不好大家勿喷哈,有不同意见的留下一起探讨。

1、在MVC开发时路由中包含了我们所有请求信息(Controller、Action、URL全文),而MVC又提供了过滤器的机制,因此我们将权限管理封装到过滤其中。首先把每个Controller的继承封装一个BaseController,这个Controller基类可以编写一些直接调用的方法,例如Session等。

    /// <summary>
/// 系统基础控制器类
/// </summary>
public abstract class BaseUIController : Controller
{
/// <summary>
/// 页面初始化过程
/// </summary>
protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
requestContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
base.Initialize(requestContext);
} /// <summary>
/// 内容返回
/// </summary>
/// <param name="content">特定内容供JS参考是否含流程定义等动作。</param>
/// <param name="contentType"></param>
/// <param name="contentEncoding"></param>
/// <returns></returns>
protected override ContentResult Content(string content, string contentType, Encoding contentEncoding)
{
return base.Content(content, contentType, contentEncoding);
} /// <summary>
/// 登陆用户ID (Session存储)
/// </summary>
public long LoginedUserID
{
get
{
object UID = Ant.UI.Controls.SessionConfig.GetSession("UID");
if (Session == null || UID == null)
return -;
else
{
return (long)UID;
}
}
set
{
Ant.UI.Controls.SessionConfig.SetSession("UID", value);
}
} /// <summary>
/// 获取URL参数值,返回 NULL 或 值
/// </summary>
/// <param name="keyName">参数名</param>
public string RequestUrlParams(string keyName)
{
if (Array.IndexOf(Request.QueryString.AllKeys, keyName) >= )
return Request.QueryString[keyName].ToString();
else
return null;
}
}

2、这个时候我们编写一个过滤器,在这个过滤器中可以在请求的Controller中获取controller名称和action名称。 有了这两个名称就能定位到具体的页面了,当然在得到页面之前我们可以判断用户是否已经登录。而页面权限页已经用数据库保存起来:A用户或R角色对某一个Controller/Action的页面(这个页面可能是新增信息、修改、删除信息的请求链接)是否有访问权限。

    /// <summary>
/// 用户登录过滤器
/// </summary>
public class UserLoginedFilter : AuthorizeAttribute
{
public string name { get; set; }
/// <summary>
/// 页面授权过程(验证用户登录状态)
/// </summary>
/// <param name="filterContext"></param>
public override void OnAuthorization(AuthorizationContext filterContext)
{
UI.Controllers.BaseUIController _ControllerObj = (UI.Controllers.BaseUIController)filterContext.Controller;
string controllerStr = _ControllerObj.ControllerContext.RouteData.Values["controller"].ToString();
string actionStr = _ControllerObj.ControllerContext.RouteData.Values["action"].ToString(); //用户尚未登陆 或 登陆超时。
if (_ControllerObj.LoginedUserID == -)
{
UserError.LoginError();
}
// 权限验证 根据 Controller 与 Action(这里可以将权限缓存取出来进行用户匹配,如果被拒绝可以抛出异常)
else if ( controllerStr.ToLower() == "admin" && actionStr.ToLower() == "login")
{
throw new HttpException("权限验证。" + _ControllerObj.ControllerContext.Controller.ToString());
} base.OnAuthorization(filterContext);
}
}

3、此时页面调用时就不用在每个Action中编写权限验证代码啦(有些权限验证的源码会在Action上增加过滤器,为了偷懒硬是想方设法把权限封装成直接在Controller类上添加一次过滤器就能完成的实现)

    [UserLoginedFilter]
public class AdminController : UI.Controllers.BaseUIController
{
/// <summary>
/// 登陆(登陆页面不需要权限验证,增加AllowAnonymous特性)
/// </summary>
[AllowAnonymous]
public ActionResult Login(FormCollection form)
{
return View();
} /// <summary>
/// 主界面
/// </summary>
public ActionResult Index()
{
return View();
}
}

上面只是我在系统开发过程中对于权限管理的一个思路,也实实在在的应用到了一些系统中,当然上面这些代码只能勉强判断是否登陆,如果你需要对数据权限、页面权限、字段权限进行管理那么就需要进一步的扩展。如果需要在抛出异常后将异常信息友好的返回给客户端,那你仍然需要在Global中捕获返回状态码以及错误信息。因此我说这只是我的一个思路,路过的朋友给我建议。多谢!

ASP.NET MVC权限控制思路的更多相关文章

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

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

  2. asp.net core mvc权限控制:分配权限

    前面的文章介绍了如何进行权限控制,即访问控制器或者方法的时候,要求当前用户必须具备特定的权限,但是如何在程序中进行权限的分配呢?下面就介绍下如何利用Microsoft.AspNetCore.Ident ...

  3. asp.net core mvc权限控制:权限控制介绍

    在进行业务软件开发的时候,都会涉及到权限控制的问题,asp.net core mvc提供了相关特性. 在具体介绍使用方法前,我们需要先了解几个概念: 1,claim:英文翻译过来是声明的意思,一个cl ...

  4. asp.net core mvc权限控制:在视图中控制操作权限

    在asp.net core mvc中提供了权限验证框架,前面的文章中已经介绍了如何进行权限控制配置,权限配置好后,权限验证逻辑自动就会执行,但是在某些情况下,我们可能需要在代码里或者视图中通过手工方式 ...

  5. 实现对ASP.NETMvc及Asp.NetCore的权限控制

    AccessControlHelper Build Status Intro 由于项目需要,需要在 基于 Asp.net mvc 的 Web 项目框架中做权限的控制,于是才有了这个权限控制组件. 项目 ...

  6. 基于资源名的MVC权限控制

    在程序复杂程度不断上升的过程中,无可避免需要触碰到权限控制,而权限控制又与业务逻辑紧紧相关,市场上出现了大量的权限控制产品,而程序的开发,讲究去繁化简的抽象,在我的开发过程中,逐渐发现程序的权限控制核 ...

  7. .NET MVC权限控制

    一.模块 权限控制的主体单位,与MVC里的Cotroller相对应. 二.模块权限 权限控制的最小单位,通过给每一个模块设置权限,可以控制到非常细小的功能. 三.角色 权限拥有者,通过给不同的角色分配 ...

  8. ASP.NET通用权限组件思路设计

    开篇 做任何系统都离不开和绕不过权限的控制,尤其是B/S系统工作原理的特殊性使得权限控制起来更为繁琐,所以就在想是否可以利用IIS的工作原理,在IIS处理客户端请求的某个入口或出口通过判断URL来达到 ...

  9. Asp.net MVC 权限过滤器实现方法的最佳实践

    在项目开发中,为了安全.方便地判断用户是否有访问当前资源(Action)的权限,我们一般通过全局过滤器来实现. Asp.net MVC 页面中常见的权限判断使用过滤器主要在以下几种情况(根据权限判断的 ...

随机推荐

  1. ZooKeeper入门搭建教程

    http://www.wxdl.cn/cloud/zookeeper-build.html 本文是ZooKeeper的快速搭建,旨在帮助大家以最快的速度完成一个ZK集群的搭建,以便开展其它工作.本方不 ...

  2. Sublime Text 3 Build 3065 License key 注册码 秘钥

    -– BEGIN LICENSE -– Andrew Weber Single User License EA7E-855605 813A03DD 5E4AD9E6 6C0EEB94 BC99798F ...

  3. Github管理自己的代码-远程篇

    一.名词解释 Git Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版 ...

  4. Docker 新手入门

    简介 如果您是 Docker 新手请您花大约三十分钟的时间来了解 Docker 相关的知识和内容. Docker 与 Linux 息息相关,因此在阅读本文档之前请您确保以下条件: 对 Linux 的命 ...

  5. .net core使用App.Metrics+InfluxDB+Grafana进行APM监控

    一.InfluxDB 1.下载InfluxDB wget https://dl.influxdata.com/influxdb/releases/influxdb-1.5.2.x86_64.rpm 2 ...

  6. (7)STM32使用HAL库实现RS485通讯(全双工串口)

    一.硬件 如下图所示,485芯片链接到单片机的USART2上,但是默认的USART2并不是在PD5和PD6上,这里是需要重映射的.另外PG4作为485收发的控制(在485协议中,RE.DE同时为高电平 ...

  7. COGS2421 [HZOI 2016]简单的Treap

    题面见这里 大概是个模板题 Treap暴力插入的做法太暴力了并不优美 这里就需要用到笛卡尔树的构造方法,定义见这里 在 假的O(n) 的时间内构造一棵Treap 把元素从小到大排序 这样从小到大插入时 ...

  8. 从壹开始前后端分离[.NetCore ] 38 ║自动初始化数据库(不定期更新)

    缘起 哈喽大家好呀,我们又见面啦,这里先祝大家圣诞节快乐哟,昨天的红包不知道有没有小伙伴抢到呢.今天的这篇内容灰常简单,只是对我们的系统的数据库进行CodeFirst,然后就是数据处理,因为这几个月来 ...

  9. Python函数小节

    定义函数时,默认参数必须指向不变的对象 参数为可变对象时,正常调用的时候,结果没有问题,但是当使用默认参数的时候,结果就会和理想的有差距. In [78]: def add(L=[]): ...: L ...

  10. ssm上传图片

    ssm上传图片 1      需求 添加客户时上传图片和客户修改信息是上传图片. 2      思路 首先,数据库创建pic字段,类型为varchar,通过逆向工程重新生成mapper接口和xml文件 ...