委托在权限验证中的应用
如何对于同窗体中的不同功能进行权限控制呢?
首先,我们明确要有多少种功能,假设有订货单的填写,查询,修改,删除,初审,复审,终审
我们先在数据库中建一个表,记录这7个操作。当然,还有其它内容的操作,也可以记录在此表中。
然后建一个模板(窗体或是web页),这里用WEB页面来举例:
/// <summary>
/// 所有要求页面验证的页面的模板,可以执行页面验证及业务操作权限验证(用委托实现)
/// </summary>
namespace Leoas
{
/// <summary>
/// 使用委托来执行业务操作,同时来验证该操作的合法性
/// </summary>
public delegate void ExcProcEvent();
public class FormTemple : System.Web.UI.Page
{
......
/// <summary>
/// 在验证用户的业务操作权限后,再决定是否执行业务操作
/// </summary>
public event ExcProcEvent OnExcProc;
protected void Page_Load(object sender, System.EventArgs e)
{
// 如果没有Session,则出错
if(Session.Count == 0)
Response.Redirect("/leoas/Errors.aspx?ErrID=7",true);
//删除非本页所产生的临时Session
this.SessionMutex(this.ToString());
if(!IsPostBack)
{
//验证页面权限,仅仅限制菜单是没有用了,用户可以通过往地址栏输入地址来打开此页面的
if(!Leoas.NoSqlMethod.ValidateAuthor(
"rolevalue",
Convert.ToUInt64(Leoas.NoSqlMethod.GetSelectedText("id",Session["s00001"].ToString(),"roleauthor",(System.Data.DataTable)Application["A00006"])),
"pagename",
this.ToString(),
(System.Data.DataTable)Application["a00005"])
)
{
Response.Redirect("/leoas/Errors.aspx?ErrID=6",true);
Response.End();
}
}
}
/// <summary>
/// 通过委托,来确定业务操作的执行
/// </summary>
/// <param name="proid">用户正在执行的操作</param>
protected void ExcProc(string proid)
{
//Leoas.NoSqlMethod.ValidateAuthor函数可以确定用户对某个操作是否有权限,其中session值保存了用户的ID,可以能过ID,由Leoas.NoSqlMethod.GetSelectedText来确定用户对应的权限值
//总体思路是,用户有权限,则执行,没有就报错
if(!Leoas.NoSqlMethod.ValidateAuthor("rolevalue",Convert.ToUInt64(Leoas.NoSqlMethod.GetSelectedText("id",Session["s00001"].ToString(),"roleauthor",(System.Data.DataTable)Application["A00006"])),"proid",proid,(System.Data.DataTable)Application["a00004"]))
{
string procname = Leoas.NoSqlMethod.GetSelectedText("proid",proid,"process",(System.Data.DataTable)Application["a00004"]);
Response.Write("<script>window.alert('您没有/"" + procname + "/"操作的权限!//n如确实需要,请与管理员联系!')</script>");
}
else
{
//执行委托
this.OnExcProc();
}
}
......
}
}
最后就可以应用这个模板了,我们假设新建一个WEB页面,就可以从上面这个模板来继承:
namespace Leoas.EMS.Mbudget
{
/// <summary>
/// MbudgetAuditByDep 的摘要说明。
/// </summary>
public class MbudgetAuditByDep : Leoas.FormTemple
{
......
//重写
new private void Page_Load(object sender, System.EventArgs e)
{
//调用基类的Page_Load,来验证用户对本页的访问权限
base.Page_Load(sender,e);
if(!IsPostBack)
{
this.BindData();
}
}
/// <summary>
/// 取得主网格的数据源
/// </summary>
private void BindGrid_hz()
{...}
/// <summary>
/// 取得明细网格数据
/// </summary>
private void BindGrid_mx()
{...}
/// <summary>
/// 在汇总表中审核
/// </summary>
private void Audit_hz()
{...}
/// <summary>
/// 在明细表中审核
/// </summary>
private void Audit_mx()
{...}
//响应[刷新]按钮click事件的总表的查询,其中,“00008”就是查询总表的操作的ID号,通过委托,
//就会调用到Leoas.NoSqlMethod.ValidateAuthor函数,来比较用户对于“00008”这个操作是否有权限
private void BT_refresh_Click(object sender, System.EventArgs e)
{
//查询之前,要先将表格的当前页设到第一页,因为有可能重新查询后,可能表的总页数会比当前页小
this.DG_hz.CurrentPageIndex = 0;
this.OnExcProc+=new ExcProcEvent(this.BindGrid_hz);
this.ExcProc("00008");
this.DG_mx.DataBind(); //清空明细表,防止误操作
}
//汇总表的翻页
private void DG_hz_SelectedIndexChanged(object sender, System.EventArgs e)
{
this.OnExcProc+=new ExcProcEvent(this.BindGrid_mx);
this.ExcProc("00008");
}
//在汇总表中审核,“00009”表示提交操作,“00010”表示审核操作
private void BTAudit_hz_Click(object sender, System.EventArgs e)
{
if(this.DG_hz.Items.Count > 0)
{
this.OnExcProc+=new ExcProcEvent(this.Audit_hz);
if(this.BTAudit_hz.Text == "提交")
this.ExcProc("00009");
else
this.ExcProc("00010");
this.BindGrid_hz();
if(this.DG_mx.Items.Count > 0)
this.BindGrid_mx();
}
}
//明细表中的操作同上
...
}
}
这样就可实现在WEB页面中对每个细节操作进行权限控制了。其实windows应用程序也是一样的,对于ValidateAuthor函数是如何验证权限的,可以看一下我其它的文章,我的blog是:http://spaces.msn.com/members/curllion