现在的位置: 首页 > 综合 > 正文

委托在权限验证中的应用

2014年09月11日 ⁄ 综合 ⁄ 共 3740字 ⁄ 字号 评论关闭

委托在权限验证中的应用

 

      如何对于同窗体中的不同功能进行权限控制呢?

      首先,我们明确要有多少种功能,假设有订货单的填写,查询,修改,删除,初审,复审,终审
我们先在数据库中建一个表,记录这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

      在开发中,我们希望一个窗体(或页面中)尽可能多地完成一些功能。比如,一个页面,可能即要做到能查询一批记录,还要做到用户能对这些记录进行审核、修改、删除。有时,我们会对菜单的权限进行控制,但菜单的权限控制只能限制权限不足的用户不能打开此窗口(WEB页面),而且,对于WEB页面,只控制了菜单,用户还是可以通过往地址栏输入地址来打开此页面的。

抱歉!评论已关闭.