发布于 2016-06-29 09:46:28 | 176 次阅读 | 评论: 0 | 来源: 网友投递

这里有新鲜出炉的精品教程,程序狗速度看过来!

ASP.NET

ASP.NET 是.NET FrameWork的一部分,是一项微软公司的技术,是一种使嵌入网页中的脚本可由因特网服务器执行的服务器端脚本技术,它可以在通过HTTP请求文档时再在Web服务器上动态创建它们。 指 Active Server Pages(动态服务器页面) ,运行于 IIS(Internet Information Server 服务,是Windows开发的Web服务器)之中的程序 。


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

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

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


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步即已完成基本的权限控制。可以在此基础上加上用户组,用户,菜单等管理,可实现”用户-角色-权限”的自由组合,一个简单的通用后台大概就是这样了。



最新网友评论  共有(0)条评论 发布评论 返回顶部

Copyright © 2007-2017 PHPERZ.COM All Rights Reserved   冀ICP备14009818号  版权声明  广告服务