您的位置:首页 > 其它

走火入魔.NET权限组件-字段访问权限(数据表字段的访问权限)思想来解决数据列的权限控制需求

2010-07-14 01:08 381 查看
答应了客户写一个控制数据列的访问控制程序,虽然已经到了深夜1点多了,还是硬着头皮把程序都调整好,文档都写好,明天客户上班了,就可以看到例子程序了,希望能满足客户的实际需要。

其实权限的存储,看透了,也是很简单的事情,就是 “什么对象对什么资源有什么权限?”把这个逻辑关系能保存好就ok了,你这样设计了,别人也容易阅读你的程序,容易理解你的数据库设计,将来也容易维护一些。

用一个思想,前后不矛盾的,把整个系统实现出来,也有些不容易,很多环节会出现前后矛盾,思路混乱的情况,所以时刻要提醒自己,自己的权限系统是按“什么对象对什么资源有什么权限?”的指导思想设计的,若有违背了这个思想,那就仔细深入思考,再重新整理思路。

什么对象:在系统里确定各种对象的唯一性,需要2个参数,一个是对象的类别,一个是对象的主键,就像是ERP里的入库单(单号)。

什么资源:什么资源,也是一样的,也需要一个分类,一个主键来识别资源的唯一性。

什么权限:最简单的做法,就是有一个权限表,只用主键来识别唯一性,而不是用“哪个模块+哪个功能”来识别权限,那样做过于繁琐了,将来的扩展性、可维护性都会很差一些,不能灵活适应各种复杂的情况。

那表格列的控制,也是一样的道理,应该有一个权限定义,这个权限叫“表格列访问控制”,什么对象是指用户还是角色,对什么资源是指各个表的列。

那有一个问题需要解决:这么多表,都有哪些字段?若都靠人工输入,那真的是搞死人,不准确不说,需要反复输入,反复维护,除非有超级耐心,否则难做到准确性、高效性;解决问题的思路是:“我们不是设计了详细的PowerDesigner数据模型吗?不仅仅拿这个生成代码,还可以生成数据表字段的说明文档

1:首先需要定义一个权限,这个权限叫“表格列访问控制”。

代码

//------------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 , Jirisoft , Ltd.
//------------------------------------------------------------

using System;
using System.Data;
using System.Web.UI.WebControls;

namespace DotNet.Web.Permission
{
using DotNet.Business;
using DotNet.Manager;
using DotNet.Utilities;

/// <remarks>
/// TableColumns
/// 表字段权限的例子
///
/// 修改纪录
///
/// 版本:1.0 2010.07.13 JiRiGaLa 写好例子程序方便别人学习。
///
/// 版本:1.0
///
/// <author>
/// <name>JiRiGaLa</name>
/// <date>2010.07.13</date>
/// </author>
/// </remarks>
public partial class TableColumns : BasePage
{
protected void Page_Load(object sender, EventArgs e)
{
// 当然是用户需要登录,否则哪里能知道,现在是判断谁的权限啊?
this.UserInfo = Utilities.Login("Jirigala_Bao@Hotmail.com", String.Empty);
// 设置表字段
// this.SetTableColumns();

// 先设置表格的字段状态
this.CheckUserTableColumnsPermission();
// 显示用户
this.GeUserList();
}

/// <summary>
/// 自动生成设置表字段
/// </summary>
private void SetTableColumns()
{
this.UserCenterDbHelper.Open();
BaseRoleManager roleManager = new BaseRoleManager(this.UserCenterDbHelper, this.UserInfo);
roleManager.SetTableColumns();

BaseUserManager userManager = new BaseUserManager(this.UserCenterDbHelper, this.UserInfo);
userManager.SetTableColumns();

BaseStaffManager staffManager = new BaseStaffManager(this.UserCenterDbHelper, this.UserInfo);
staffManager.SetTableColumns();

BaseModuleManager moduleManager = new BaseModuleManager(this.UserCenterDbHelper, this.UserInfo);
moduleManager.SetTableColumns();

this.UserCenterDbHelper.Close();
}

private void GeUserList()
{
// 获取用户列表
BaseUserManager userManager = new BaseUserManager();
DataTable dataTable = userManager.GetDT();
this.grvUser.DataSource = dataTable;
this.grvUser.DataBind();
}

private void CheckUserTableColumnsPermission()
{
// 当前用户能访问那些字段?
this.UserCenterDbHelper.Open();
BaseTableColumnsManager tableColumnsManager = new BaseTableColumnsManager(this.UserCenterDbHelper, UserInfo);
DataTable dataTable = tableColumnsManager.GetTableColumns(this.UserInfo.Id, "Base_User");
this.UserCenterDbHelper.Close();

for (int i = 0; i < this.grvUser.Columns.Count; i++)
{
if (this.grvUser.Columns[i] is BoundField)
{
BoundField boundField = (BoundField)this.grvUser.Columns[i];
// 这个字段是否可以查看?
boundField.Visible = BaseBusinessLogic.Exists(dataTable, BaseTableColumnsTable.FieldColumnCode, boundField.DataField);
}
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐