用户访问服务器实际上就是访问控制器下的方法,因此在权限控制就是控制器方法的访问权限

为了方便控制,我们可以建立一个基类控制器(BaseController),让需要的控制器继承这个控制器即可,在BaseController我们实现权限的控制

用户访问时先查询该用户对应角色的权限,如果有则直接跳转,如果未具备该权限则查询该用户直接对应权限的信息,如果没有则跳转错误页面

namespace CZBK.ItcastOA.WebApp.Controllers
{
public class BaseController : Controller
{
public UserInfo LoginUser { get; set; }
/// <summary>
/// 执行控制器中的方法之前先执行该方法。
/// </summary>
/// <param name="filterContext"></param>
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
//if (Session["userInfo"] == null)
bool isSucess = false;
if(Request.Cookies["sessionId"]!=null)
{
string sessionId = Request.Cookies["sessionId"].Value;
//根据该值查Memcache.
object obj=Common.MemcacheHelper.Get(sessionId);
if(obj!=null)
{
UserInfo userInfo = Common.SerializeHelper.DeserializeToObject<UserInfo>(obj.ToString());
LoginUser = userInfo;
isSucess = true;
Common.MemcacheHelper.Set(sessionId, obj, DateTime.Now.AddMinutes());//模拟出滑动过期时间.
//完成权限校验。
//获取用户请求的URL地址.
string url = Request.Url.AbsolutePath.ToLower();
//获取请求的方式.
string httpMehotd = Request.HttpMethod;
//根据获取的URL地址与请求的方式查询权限表。
IApplicationContext ctx = ContextRegistry.GetContext();
IBLL.IActionInfoService ActionInfoService = (IBLL.IActionInfoService)ctx.GetObject("ActionInfoService");
            //查询当前地址对应的权限信息
var actionInfo= ActionInfoService.LoadEntities(a=>a.Url==url&&a.HttpMethod==httpMehotd).FirstOrDefault();
if (actionInfo != null)
{
filterContext.Result = Redirect("/Error.html");
return;
}
//判断用户是否具有所访问的地址对应的权限
IUserInfoService UserInfoService = (IUserInfoService)ctx.GetObject("UserInfoService");
var loginUserInfo = UserInfoService.LoadEntities(u=>u.ID==LoginUser.ID).FirstOrDefault();
//1:可以先按照用户权限这条线进行过滤。
var isExt =(from a in loginUserInfo.R_UserInfo_ActionInfo
where a.ActionInfoID == actionInfo.ID
select a).FirstOrDefault();
if (isExt != null)
{
if (isExt.IsPass)
{
return;
}
else
{
filterContext.Result = Redirect("/Error.html");
return;
}
}
//2:按照用户角色权限这条线进行过滤。
var loginUserRole = loginUserInfo.RoleInfo;
var count = (from r in loginUserRole
from a in r.ActionInfo
where a.ID == actionInfo.ID
select a).Count();
if (count < )
{
filterContext.Result = Redirect("/Error.html");
return;
}
}
// filterContext.HttpContext.Response.Redirect("/Login/Index"); }
if (!isSucess)
{
filterContext.Result = Redirect("/Login/Index");//注意.
}
}
}
}

注意:因为在BaseController中不能通过Spring.net配置文件直接拿到UserInfoService,所以通过ContextRegistry.GetContext()方法创建一个IApplicationContext对象,通过该对象的GetObject方法,拿到配置文件Service.xml中的对象

在BaseController中先对用户Session进行判断,判断用户是否登录,这里用的是Memache储存的序列化后的用户信息,根据用户Cookie中携带的MemacheID查找数据库中的数据

string httpMehotd = Request.HttpMethod;
string url = Request.Url.AbsolutePath.ToLower(); 得到用户当前请求方法的地址

根据路径和请求方法找到对应权限的对象
var actionInfo= ActionInfoService.LoadEntities(a=>a.Url==url&&a.HttpMethod==httpMehotd).FirstOrDefault();
查找当前用户直接对应权限表中的权限
var isExt =(from a in loginUserInfo.R_UserInfo_ActionInfo
where a.ActionInfoID == actionInfo.ID
select a).FirstOrDefault();
根据当前用户对应角色权限查找
                   var loginUserRole = loginUserInfo.RoleInfo;
var count = (from r in loginUserRole
from a in r.ActionInfo
where a.ID == actionInfo.ID
select a).Count();
 

MVC基于角色权限控制--权限过滤的更多相关文章

  1. 尝试asp.net mvc 基于controller action 方式权限控制方案可行性

    微软在推出mvc框架不久,短短几年里,版本更新之快,真是大快人心,微软在这种优秀的框架上做了大量的精力投入,是值得赞同的,毕竟程序员驾驭在这种框架上,能够强力的精化代码,代码层次也更加优雅,扩展较为方 ...

  2. ASP.NET MVC 基于角色的权限控制系统的示例教程

    上一次在 .NET MVC 用户权限管理示例教程中讲解了ASP.NET MVC 通过AuthorizeAttribute类的OnAuthorization方法讲解了粗粒度控制权限的方法,接下来讲解基于 ...

  3. 尝试asp.net mvc 基于controller action 方式权限控制方案可行性(转载)

    微软在推出mvc框架不久,短短几年里,版本更新之快,真是大快人心,微软在这种优秀的框架上做了大量的精力投入,是值得赞同的,毕竟程序员驾驭在这种框架上,能够强力的精化代码,代码层次也更加优雅,扩展较为方 ...

  4. jenkins配置基于角色的项目权限管理设置步骤

    jenkins配置基于角色的项目权限管理设置步骤 本文链接:https://blog.csdn.net/russ44/article/details/52276222 由于jenkins默认的权限管理 ...

  5. Jenkins配置基于角色的项目权限管理--转

    本文将介绍如何配置jenkins,使其可以支持基于角色的项目权限管理. 由于jenkins默认的权限管理体系不支持用户组或角色的配置,因此需要安装第三发插件来支持角色的配置,本文将使用Role Str ...

  6. Jenkins配置基于角色的项目权限管理

    转自: http://www.cnblogs.com/gao241/archive/2013/03/20/2971416.html, 版权归原作者. 本文将介绍如何配置jenkins,使其可以支持基于 ...

  7. MVC基于角色权限控制--数据库设计

    在网站后台设计过程中都会遇上权限控制这一问题 当前较为流行的解决方案是基于角色的权限管理 基本思路如下 分别建立 用户信息表.角色信息表.权限信息表 让用户和角色关联,角色和权限关联,当用户访问时,通 ...

  8. MVC基于角色权限控制--用户管理

    用户管理模块包括 新增用户.修改用户.展示用户列表.删除用户.用户角色分配.用户角色删除.用户权限分配 这里只介绍关于权限有关的 用户角色分配.用户角色删除.用户权限分配 新建控制器 UserInfo ...

  9. ASP.net MVC 基于角色的权限控制系统的实现

    一.引言 我们都知道ASP.net mvc权限控制都是实现AuthorizeAttribute类的OnAuthorization方法. 下面是最常见的实现方式: public class Custom ...

随机推荐

  1. pytest.2.运行多个文件

    From: http://www.testclass.net/pytest/multiple_tests/ 背景 在现实的测试活动中,我们经常会定义多个用例文件,用来实现业务逻辑或其他逻辑上用例的物理 ...

  2. C/C++基础--模板与泛型编程

    模板参数 函数模板,编译器根据实参来为我们推断模板实参. 模板中可以定义非类型参数,表示一个值而非一个类型,这些值必须是常量表达式,从而允许编译器在编译时实例化模板. 非类型参数可以是整型,或者一个指 ...

  3. Kubernetes DNS服务配置案例

    首先创建DNS服务的RC配置文件skydns-rc.yaml apiVersion: v1 kind: ReplicationController metadata: name: kube-dns-v ...

  4. 【ZZ】技能表合集

    技能表 http://w.itcodemonkey.com/tag/373.html 1 当一名黑客应该学什么?来看看安全工程师技能表 2 软件测试工程师技能表 3 大数据.数据挖掘技能表 4 C/C ...

  5. 【ZZ】C++11之统一初始化语法 | 桃子的博客志

    C++11之统一初始化语法 | 桃子的博客志 https://taozj.net/201710/list-initialize.html 在当前新标准C++11的语法看来,变量合法的初始化器有如下形式 ...

  6. C语言强化——链表(2)

    目录 链表的应用: 栈 循环队列 C语言实现动态数组 数组实现定长元素个数层次建树 队列实现不定元素个数层次建树 (*) 栈 栈(链表应用) "stack.h" #include ...

  7. Kowala协议:一组分布式,自我调节,资产跟踪特性的加密货币(二)

    对于稳定币来言,设计过程中会遇到很多细节的问题,今天来讲述下有关通证设计过程中的一些问题. 1.计算手续费 计算费是交易费的一部分,转移给kUSD矿工,并由以下公式决定: 其gasUsed(t) 是用 ...

  8. Jmeter(三十六)纵横并发、限制QPS

    一.纵横并发 Jmeter设计并发事件,这应该是一项必备技能. 首先来看并发的概念. 通常在性能测试中会涉及到并发用户数的概念,有关并发用户数(系统用户数)的详解后续再记. (有关并发.并行的概念参考 ...

  9. Spring MVC 原理图

    SpringMVC的工作原理图: SpringMVC流程 1.  用户发送请求至前端控制器DispatcherServlet. 2.  DispatcherServlet收到请求调用HandlerMa ...

  10. Spring+MyBatis实现数据库读写分离方案

    推荐第四种:https://github.com/shawntime/shawn-rwdb 方案1 通过MyBatis配置文件创建读写分离两个DataSource,每个SqlSessionFactor ...