一个基于Asp.Net MVC的权限方案

    最近这段时间博客园有几位同学在探讨通用的权限方案,偶闲来无事,也来凑凑热闹,下面简单说一下我的简单解决方案,基于AOP的。由于使用了Asp.Net MVC 开发,可能需要先对MVC有些了解,思路都是差不多的。

1.数据结构

Mad_Popedom为权限表,Control记录控制器名,Action记录动作名。
Mad_Role为角色表。

2.权限控制的实现
此处使用比较简单AOP方式,用MVC的Filter实现,代码如下

ContractedBlock.gif ExpandedBlockStart.gif Code
using System.Collections.Generic;
using System.Web.Mvc;
using Madnet.Model.MadAdmin;
using Madnet.BLL.MadAdmin;

namespace Madnet.Controllers.MadAdmin
{
    
public class SupportFilterAttribute : ActionFilterAttribute
    {
        
private bool _IsLogin = true;
        
/// <summary>
        
/// 是否需要登录
        
/// </summary>
        public bool IsLogin
        {
            
set
            {
                _IsLogin 
= value;
            }
            
get
            {
                
if (System.Configuration.ConfigurationManager.AppSettings["IsLogin"!= null)
                {
                    
bool.TryParse(System.Configuration.ConfigurationManager.AppSettings["IsLogin"].ToString(), out _IsLogin);
                }
                
return _IsLogin;
            }
        }
        
public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            
string controllerName = (string)filterContext.RouteData.Values["controller"];
            
string actionName = (string)filterContext.RouteData.Values["action"];

            
if (IsLogin && filterContext.HttpContext.Session["Login_User"== null)
            {
                filterContext.HttpContext.Response.Redirect(
new UrlHelper(filterContext.RequestContext).Action("Login""Default"));
                filterContext.Result 
= new EmptyResult();
            }
            
else if (IsLogin && filterContext.HttpContext.Session["Login_User"!= null)
            {
                Mad_User user 
= filterContext.HttpContext.Session["Login_User"as Mad_User;
                
if (!user.is_super)
                {
                    
if (!GetPopedom(user).Exists(p => p.Controller_Name == controllerName.ToLower() && p.Action_Name == actionName.ToLower()))
                    {
                        filterContext.HttpContext.Response.Write(
"没有权限");
                        filterContext.Result 
= new EmptyResult();
                    }

                }
            }

        }
        
/// <summary>
        
/// 获取当前用户所有有权限执行的动作
        
/// </summary>
        
/// <returns></returns>
        public List<Atmodel> GetPopedom(Mad_User user)
        {
            List
<Atmodel> ats = new List<Atmodel>();
            List
<mad_popedom> pops = Mad_PopedomBLL.GetPopedombyUser(user.user_id);
            
foreach (Mad_Popedom pop in pops)
            {
                ats.Add(
new AtModel() { Controller_Name = pop.Control, Action_Name = pop.Action });
            }
            
return ats;
        }

    }
}

解释一下,上面的代码就是在执行前,先获取登录用户可以运行的Controller-Action,然后和当前需要执行的Controller-Action比较,如存在,即通过,否则为没有权限执行。

3.为动作添加权限
为简单起见,对于Controller层我是独立出来一个类库的,好处是等会为角色添加权限的时候我们不需要手动输入,只要反射dll就可以了。

如图所示,凡需要权限控制的函数,只需要添加[SupportFilter]特性就可以了,当然这种方式只能控制到Action级。

4.为角色额添加权限
这个比较简单,只需要把角色和权限关联起来就可以了,这里我是用反射Controller层dll实现。
Web.config

Global.asax.cs

Madnet.Controllers.Test即为Controller层的dll

Test为Controller名,index为Action名,选择role2可以访问的Action,提交到数据库即可。此图表示role2拥有Test1Controller的访问权限,但是没有Test2Controller,Test3Controller的访问权限。

5.结束
上面4步即已完成基本的权限控制。可以在此基础上加上用户组,用户,菜单等管理,可实现”用户-角色-权限”的自由组合,一个简单的通用后台大概就是这样了。


----------------------------------------------------------------------------------------
文章发表于:http://www.qwolf.com/?p=454

posted on 2009-06-20 08:50 xuzhibin 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/xuzhibin/archive/2009/06/20/1507208.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
asp.net mvc 通用权限管理系统(响应布局)源码是基于asp.net(C#)MVC+前端bootstrap+ztree+lodash+jquery技术,采用bootstrap为前台开发展示UI,Web Api主要负责前端的逻辑交互,再结合jQuery Ajax+Web Api进行提交数据请求。 框架特色: 1、为了数据方便读写,语言的成熟性,选择asp.net开发效率更高效率更快; 2、系统架构采用:耦合性低、重用性高、部署快、可维护性高等优点的MVC框架进行搭建; 3、系统配置文件数据采用HttpRuntime.Cache进行缓存,使得程序在运行中效率更高、速度更快; 4、数据库的选型,根据系统的数据规模与需求方的相关要求,综合多方考量,调研多种数据库后选定mysql为系统数据库; 5、运行环境根据功能模块的特点,选型window server2008+IIS,部署更简洁; 6、使用报表导出开源组件NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作; 7、为了兼容更多的浏览器,让用户界面使用更友好。我们选择了响应式布局框架bootstrap; 8、系统报表我们采用了echarts开源软件,并且我们提供了非常炫酷的图形界面,特色是地图,另外还提供了柱状图、折线图、饼图、气泡图及四象限图等; 9、系统采用bootstrap响应式布局,这样面对不同分辨率设备灵活性强能够快捷解决多设备显示适应问题; 10、系统基于ASP.NET(C#) MVC +web api+Bootstrap +Jquery+ MYSQL前端采用响应式布局对页面兼容性显著提高; 系统优势: 代码可以满足大部分开发者的需求,让开发人员能省不少时间 ASP.NET MVC通用角色权限管理系统源码 更新日志: 2020-03-23 更新如下: 1、新增文件上传功能实例,保证文件能够无误上传保存并下载; 2、优化后台系统框架代码,删除以前大项目其它无用功能; 3、新增页面代码JS、css文件的压缩,使得系统运行速度更快; 4、系统登录页面新增验证校验过程,这样做到输入验证码时时验证; 5、优化系统加载页面提示数据加载功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值