ASP.NET MVC权限控制思路
在系统开发的时候一个老生常谈的权限管理问题,翻阅了很多的网络资料,但是总感觉离实际使用还有一段距离,其实权限控制无非就几个“请求、页面按钮、字段显示”, 对于前端权限就需要配合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权限控制思路的更多相关文章
- 开篇ASP.NET MVC 权限管理系列
开篇 [快乐编程系列之ASP.NET MVC 权限管理系列]一.开篇 用了好长一段时间的ASP.NET MVC,感觉MVC真的是很好用,最近一年左右做了两个中小型项目,觉得还是很多地方不是很熟悉的 ...
- asp.net core mvc权限控制:分配权限
前面的文章介绍了如何进行权限控制,即访问控制器或者方法的时候,要求当前用户必须具备特定的权限,但是如何在程序中进行权限的分配呢?下面就介绍下如何利用Microsoft.AspNetCore.Ident ...
- asp.net core mvc权限控制:权限控制介绍
在进行业务软件开发的时候,都会涉及到权限控制的问题,asp.net core mvc提供了相关特性. 在具体介绍使用方法前,我们需要先了解几个概念: 1,claim:英文翻译过来是声明的意思,一个cl ...
- asp.net core mvc权限控制:在视图中控制操作权限
在asp.net core mvc中提供了权限验证框架,前面的文章中已经介绍了如何进行权限控制配置,权限配置好后,权限验证逻辑自动就会执行,但是在某些情况下,我们可能需要在代码里或者视图中通过手工方式 ...
- 实现对ASP.NETMvc及Asp.NetCore的权限控制
AccessControlHelper Build Status Intro 由于项目需要,需要在 基于 Asp.net mvc 的 Web 项目框架中做权限的控制,于是才有了这个权限控制组件. 项目 ...
- 基于资源名的MVC权限控制
在程序复杂程度不断上升的过程中,无可避免需要触碰到权限控制,而权限控制又与业务逻辑紧紧相关,市场上出现了大量的权限控制产品,而程序的开发,讲究去繁化简的抽象,在我的开发过程中,逐渐发现程序的权限控制核 ...
- .NET MVC权限控制
一.模块 权限控制的主体单位,与MVC里的Cotroller相对应. 二.模块权限 权限控制的最小单位,通过给每一个模块设置权限,可以控制到非常细小的功能. 三.角色 权限拥有者,通过给不同的角色分配 ...
- ASP.NET通用权限组件思路设计
开篇 做任何系统都离不开和绕不过权限的控制,尤其是B/S系统工作原理的特殊性使得权限控制起来更为繁琐,所以就在想是否可以利用IIS的工作原理,在IIS处理客户端请求的某个入口或出口通过判断URL来达到 ...
- Asp.net MVC 权限过滤器实现方法的最佳实践
在项目开发中,为了安全.方便地判断用户是否有访问当前资源(Action)的权限,我们一般通过全局过滤器来实现. Asp.net MVC 页面中常见的权限判断使用过滤器主要在以下几种情况(根据权限判断的 ...
随机推荐
- LESS的好处
今日目标: 1:今天的学习内容是在工作完成的情况下,学习Less(之所以学习Less是因为项目中使用的是Less)-------------当前进度(0%) 注意项: 务必确保在 less.js 之前 ...
- C++使用类和对象
1. 内置函数 程序调用函数时需要一定的时间和空间开销,其执行过程一般如下: 而C++提供了一种高效率的方法,即在编译的时候将所调用函数的代码直接嵌入到主函数中,而不是将流程转出去,这样可以避免函数调 ...
- windows7 dos修改mysql root密码
第一步:打开mysql 安装路径 选择bin文件 同时按下Shift+鼠标右键 点击"在此处打开命令" 第二步:输入mysql -u root -p 按回车键会提示输入密码 ...
- Oracle解决Ora-01653无法扩展表空间问题
先针对可能性1查看表空间使用情况 SELECT UPPER(F.TABLESPACE_NAME) "表空间名", D.TOT_GROOTTE_MB "表空间大小(M) & ...
- js算法初窥04(算法模式01-递归)
终于来到了有点意思的地方--递归,在我最开始学习js的时候,基础课程的内容就包括递归,但是当时并不知道递归的真正意义和用处.我只是知道,哦...递归是自身调用自身,递归要记得有一个停止调用的条件.那时 ...
- Java 读书笔记 (十四) Java 方法
finalize() 方法 finalize() 用来清除回收对象. //为什么要回收内存?怎样写可以避免内存过多占用?什么时候需要手动回收内存? protected void finalize() ...
- Kafka的CommitFailedException异常
一.含义 CommitFailedException异常:位移提交失败时候抛出的异常.通常该异常被抛出时还会携带这样的一段话: Commit cannot be completed since the ...
- 【构造】Bzoj1432[ZJOI2009]Function
Description Input 一行两个整数n; k. Output 一行一个整数,表示n 个函数第k 层最少能由多少段组成. Sample Input 1 1 Sample Output 1 ...
- Android 画文字图
画图 private Bitmap getbitmap(String content) { Bitmap bitmap = Bitmap.createBitmap(400, 400, Bitmap.C ...
- poj 3687
Description Windy has N balls of distinct weights from 1 unit to N units. Now he tries to label them ...