ASP.NET MVC5+EF6+EasyUI 后台管理系统(21)-权限管理系统-跑通整个系统
这一节我们来跑通整个系统,验证的流程,通过AOP切入方式,在访问方法之前,执行一个验证机制来判断是否有操作权限(如:增删改等)
原理:通过MVC自带筛选器,在筛选器分解路由的Action和controller来验证是否有权限。
首先我们要理解一下筛选器
筛选器的由来及用途
有时,您需要在调用操作方法之前或运行操作方法之后执行逻辑。
为了对此提供支持,ASP.NET MVC 提供了筛选器。 筛选器是自定义类,可提供用于向控制器操作方法添加操作前行为和操作后行为的声明性和编程性手段。
ASP.NET MVC 支持以下类型的操作筛选器:
授权筛选器。 这些筛选器用于实现 IAuthorizationFilter 和做出关于是否执行操作方法(如执行身份验证或验证请求的属性)的安全决策。 AuthorizeAttribute 类和 RequireHttpsAttribute 类是授权筛选器的示例。 授权筛选器在任何其他筛选器之前运行。
操作筛选器。 这些筛选器用于实现 IActionFilter 以及包装操作方法执行。 IActionFilter 接口声明两个方法:OnActionExecuting 和 OnActionExecuted。 OnActionExecuting 在操作方法之前运行。 OnActionExecuted 在操作方法之后运行,可以执行其他处理,如向操作方法提供额外数据、检查返回值或取消执行操作方法。
结果筛选器。 这些筛选器用于实现 IResultFilter 以及包装 ActionResult 对象的执行。 IResultFilter 声明两个方法:OnResultExecuting 和 OnResultExecuted。 OnResultExecuting 在执行 ActionResult 对象之前运行。 OnResultExecuted 在结果之后运行,可以对结果执行其他处理,如修改 HTTP 响应。 OutputCacheAttribute 类是结果筛选器的一个示例。
异常筛选器。 这些筛选器用于实现 IExceptionFilter,并在 ASP.NET MVC 管道执行期间引发了未处理的异常时执行。 异常筛选器可用于执行诸如日志记录或显示错误页之类的任务。 HandleErrorAttribute 类是异常筛选器的一个示例。
创建自定义操作筛选器
框架将先调用操作筛选器的 OnActionExecuting 方法,然后再调用以操作筛选器特性标记的任意操作方法。 同样,该框架将在操作方法完成后调用 OnActionExecuted 方法。
调用 OnResultExecuting 方法后,要立即调用您的操作返回的 ActionResult 实例。 执行结果后,紧接着就要调用 OnResultExecuted 方法。 这些方法对于执行日志记录、缓存输出结果之类的操作非常有用。
以上都是理论问题了,说到底我们就是要OnActionExecuting利用这个方法
当一个Action被执行时调用OnActionExecuting判断是否有权限操作。
由于OnActionExecuting涉及到其他用户和权限的访问我们需要添加SysUser和SysRight的BLL和DAL层了
我们还需要一个存储过程[P_Sys_GetRightOperate]用于取模块的当前用户操作权限,这里为什么用存储过程呢,快点呗,反正这快不用怎么维护了
存储过程如下:
USE db GO /****** Object: StoredProcedure [dbo].[P_Sys_GetRightOperate] Script Date: 12/01/2013 12:25:48 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: <Author,,Name> -- Create date: <Create Date,,> -- Description: <Description,,> -- ============================================= CREATE PROCEDURE [dbo].[P_Sys_GetRightOperate] @userId varchar(50),@url varchar(200) AS --取模块的当前用户操作权限 select distinct KeyCode,IsValid from SysRightOperate where RightId in( select a.id from SysRight a, SysModule b where RoleId in( select SysRoleId from SysRoleSysUser where SysUserId =@userId) and a.ModuleId = b.Id and b.Url =@url) and IsValid=1 GO
创建好了把存储过程更新到EF中去,EF5.0将自动创建一个复杂的类型,大家可以打开来看下
创建一个权限的类permModel,我们将获取到的权限保存到这个类中去,这个类最终是一个一个的session转换而来的。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace App.Models.Sys { public class permModel { public string KeyCode { get; set; }//操作码 public bool IsValid { get; set; }//是否验证 } }
SysUser的BLL层和SysRight的DAL层了,如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using App.Models; using App.Models.Sys; namespace App.IDAL { public interface ISysRightRepository { List<permModel> GetPermission(string accountid, string controller); } }