我不想让权限控制权权局限于访问某个页面,而想对页面类中的方法也进行控制。如:页面A中有两个按钮,一个是"添加",一个个是"删除",我想让不同的用户分别具有添加或者删除的权限。但我不想在两个方法(如:btnAdd_onClick, btnDelete_onClick)方法中进行判断。而想统一的先判断用户将要调用哪个方法,再判断他是否具有调用那个方法的权限,如果有则继续执行(调用那个方法),如果没有则中止。
调试欢乐多
一个Button就可以了啊
如:
private void btnSubmit_Click(object sender, System.EventArgs e)
{
if (Session["UserPower"] == null)
return;
string strUserPower = Session["UserPower"].ToString();
switch(strUserPower)
{
case "Add":
this.Add();
break;
case "Del":
this.Del();
break;
default:
break;
}
}
————————————————————————————————————————————
A: asp.net2.0现在有两种方式——postback方式、callback方式。以前只有postback方式。在asp.net2.0 中 treeview、gridView都有利用客户端回调做到的所谓“无刷新”功能,但是总的来说callback由于是新出来的,使用它的控件还很少。所有需要接收客户端提交的值并且触发形如xxxChanged事件的控件都要实现IPostbackDatahandler接口,所有响应客户端回发事件的控件都要实现IPostBackEventHandler接口。你从浏览器察看网页的客户端源代码,可以看到很多 __doPostback('xxx$yyy','arg') 样子的代码。这个__doPostback 脚本函数实际上执行 form.submit 方法,也就是提交窗体中的值(使用http的POST指令)到服务器(并且下载结果html进行显示)。提交式,把隐藏字段 __ViewState等几个关键的字段也一并提交。其中,包括xxx$yyy和后边的参数作为提交的值。服务器端,首先将__ViewState隐藏域中的值填入各个控件,之后页面调用多有实现了IPostbackDataHandler接口的控件使用这个接口中的一个函数(好像是LoadPostData方法)传递给它客户端的最新提交的值,并且它返回的bool值表示是否需要下一步要触发xxxxChanged类型的事件。page_load事件执行完毕之后(对于2.0就是page_loadcomplete事件执行完毕之后),会把在这个事件中动态创建的控件的ViewState、Post值填入。然后,触发上面已经保存好的所有xxxxChanged类型的事件。之后会查找xxx$yyy所对应的控件(根据这个控件的UniqueName属性),如果没有找到就放弃了,如果找到了就调用这个控件的IPostBackEventhandler中的方法(arg是参数),每个控件内部会在处理这个raisePostBackEvent方法的内部去触发自己的事件,例如按钮的Click、Calendar的VisibleMonthChanged和SelectionChanged、MenuItem的 MenuItemClick 等事件。
在用户登录页面的时候,对他的权限进行判断,然后根据权限屏蔽一些Button或者textbox,让用户无法使用。方法二:
将方法分类保存在不同的目录,进行权限管理。方法三:
在用户触发事件后,对其权限进行判断,如果有权限,继续执行,如果没有权限,弹出错误信息,同时中止操作
======================================================================================
首先非常感谢您的回答,我现在还没有想要做到自动化地控制页面,我目前所想实现的功能就是:
1.页面呈现所有的控件
2.用户使用控件,触发相应的事件
3.程序解释用户所调用的方法(如:WebForm1.btnAdd_Click),如果其具有该权限,则执行否则中断执行,并提示无此权限。我目前的困扰就在第三步。程序应该如何去判断用户将会执行哪部份程序(比如在Page_Load中判断)。例如:有页面 WebForm1,其中有两个按钮 btnAdd 及 btnDel ,现在用户点击 btnAdd 按钮,页面 PostBack。当然啦在程序进入 WebForm1.btnAdd_Click 之前会先进入 WebForm1.Page_Load,我现在就是要在 Page_Load 里面去判断程序将会执行 WebForm1.btnAdd_Click 还是 WebForm1.btnDel_Click。当然啦,不仅仅局限于 Page_Load 如果能在更低层判断就更好了(如 Application_BeginRequest 中)。还有一点就是肯定不能在 WebForm1.btnAdd_Click 等等之类的方法里面去判断,那样就没有任何意义了。
建立一个权限处理类,数据格式为Hashtable,Key是类名_方法名,value为1 or 0
登录时,把所有的权限放到一个Hashtable里,执行一个方法前,第一句判断是否有此类此方法的权限.
——————————————————————————————————————————
A: 其实我的疑问是:你又是如何去写程序的呢?原来你写程序的时候并不考虑动态装载控件问题。
建立一个权限处理类,数据格式为Hashtable,Key是类名_方法名,value为1 or 0
登录时,把所有的权限放到一个Hashtable里,执行一个方法前,第一句判断是否有此类此方法的权限.
=================================================================================
我现在的想法就是不想在每个方法里面都加上判断的语句。在执行所有方法前判断用户是否有执行该方法的权限。这样可以集中的管理。因为一旦程序的身份验证策略有变,那么你不得不更改每一处代码。我现在想做的就是想封装用户身份验证策略。程序的类/方法中只需加入该类/方法的 Attribute 以给该类/方法更友好的命名及说明,如:[Power(Name="Car", Desc="车辆管理")]
public class Car
{
public void Item() {} [Power(Name="Car.Add", Desc="添加车辆")]
public bool Add() {...} [Power(Name="Car.Del", Desc="删除车辆")]
public bool Del() {...}
}然后用反射判断要调用的方法的 Power.Name 是否在权限列表中,如果存在则执行,如果不存在则中止。
这样做弹性也很大啊.权限类里,控制着所有页面和方法权限.而某个用户的权限则存在用户数据表里,登录时,取出权限,分配到Hashtable里.
不过如果要改Hashtable中权限位置的话,还是比较麻烦.毕竟这样的情况不多
可以为每个用户配置不同的角色,为每个角色配置权限,可以根据当前登陆用户从数据中获取该用户的权限结构,或部分权限结构
没有权限的可以不让显示,<button style="display:<%=根据权限结构得到的值%>">删除</button>