技术开发 频道

如何使用动态代理实现权限验证


【IT168技术文档】

  首先我们建一个工程,名字随个人喜好啦,(由于本人使用的机器是装的VS2005英文版,所以Demo也是用它完成的,其中可能有些文件的组织方式是按照VS2005来的,不过也没关系,只要把partial类的内容合并了就可以放在2003下面用了)
配置文件内容如下:
1<configuration> 2 <configSections> 3 <!--用来配置权限的配置节--> 4 <section name="PopedomControlList" type="System.Configuration.DictionarySectionHandler"/> 5 </configSections> 6 7 <!--控制信息,这里控制了按钮的访问权限--> 8 <PopedomControlList> 9 <add key="btnOne" value="true"/> 10 <add key="btnTwo" value="true"/> 11 <add key="btnThree" value="false"/> 12 </PopedomControlList> 13 14</configuration>
  配置文件中配置了我对3个按钮的访问权限,true为可以访问,false不能访问。

  OK,我们再在工程中添加对Castle.DynamicProxy.dll的引用,然后就可以开始写代码了。

  设计好窗体(这里就不再详细说明了),然后创建一个拦截器:
7using System; 8using System.Collections.Generic; 9using System.Text; 10using System.Windows.Forms; 11 12using Castle.DynamicProxy; 13 14namespace PopedomDemo 15{ 16 /**//// <summary> 17 /// 实现方法调用拦截处理 18 /// </summary> 19 public class MyInterceptor : StandardInterceptor 20 { 21 22 IInterceptor Members#region IInterceptor Members 23 public override object Intercept(IInvocation invocation, params object[] args) 24 { 25 //判断并只处理按钮事件 26 if (args.Length > 0) 27 { 28 Button btn = args[0] as Button; 29 if (btn != null) 30 { 31 string btnName = btn.Name; 32 if (Program.PopedomList.Contains(btnName)) 33 { 34 if (Check(btnName)) 35 { 36 return invocation.Proceed(args); 37 } 38 return null; 39 } 40 } 41 } 42 return base.Intercept(invocation, args); 43 } 44 45 46 #endregion 47 /**//// <summary> 48 /// 检查按钮权限 49 /// </summary> 50 /// <param name="btnName"></param> 51 /// <returns></returns> 52 private bool Check(string btnName) 53 { 54 if (Program.PopedomList[btnName] != null) 55 { 56 if (Program.PopedomList[btnName].ToString().ToLower() == "true") 57 { 58 return true; 59 } 60 } 61 return false; 62 } 63 } 64} 65
0
相关文章