Project级别的权限控制

原创 2004年07月12日 05:11:00

在项目中常常要定义不同的Project级别的用户和权限,仿照windows的Role/User/Access Right的控制,我的实现如下:

1、在数据库中建立5个表:tSvRole, tSvUser, tSvObject, tSvRoleUser和tSvRoleObject,分别存储Role、User、Object、Role-User对应关系以及Role-Object对应关系。建表的tsql如下:

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tSvObject]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[tSvObject]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tSvRole]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[tSvRole]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tSvRoleObject]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[tSvRoleObject]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tSvRoleUser]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[tSvRoleUser]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tSvUser]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[tSvUser]
GO

CREATE TABLE [dbo].[tSvObject] (
  [fObjectId] [varchar] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
  [fObjectName] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[tSvRole] (
  [fRoleId] [varchar] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
  [fRoleName] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[tSvRoleObject] (
  [fRoleId] [varchar] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
  [fObjectId] [varchar] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
  [fVisible] [bit] NOT NULL ,
  [fEnable] [bit] NOT NULL ,
  [fExecutable] [bit] NOT NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[tSvRoleUser] (
  [fRoleId] [varchar] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
  [fUserId] [varchar] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[tSvUser] (
  [fUserId] [varchar] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
  [fUserName] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
  [fUserPwd] [nvarchar] (20) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
  [fUserEmail] [varchar] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[tSvObject] WITH NOCHECK ADD
  CONSTRAINT [PK_tSvObject] PRIMARY KEY  CLUSTERED
  (
    [fObjectId]
  )  ON [PRIMARY]
GO

ALTER TABLE [dbo].[tSvRole] WITH NOCHECK ADD
  CONSTRAINT [PK_tSvPrjRole] PRIMARY KEY  CLUSTERED
  (
    [fRoleId]
  )  ON [PRIMARY]
GO

ALTER TABLE [dbo].[tSvRoleObject] WITH NOCHECK ADD
  CONSTRAINT [DF_tSvRoleObject_fVisible] DEFAULT (0) FOR [fVisible],
  CONSTRAINT [DF_tSvRoleObject_fEnabled] DEFAULT (0) FOR [fEnable],
  CONSTRAINT [DF_tSvRoleObject_fExecutable] DEFAULT (0) FOR [fExecutable],
  CONSTRAINT [PK_tSvRoleObject] PRIMARY KEY  CLUSTERED
  (
    [fRoleId],
    [fObjectId]
  )  ON [PRIMARY]
GO

ALTER TABLE [dbo].[tSvRoleUser] WITH NOCHECK ADD
  CONSTRAINT [PK_tSvRoleUser] PRIMARY KEY  CLUSTERED
  (
    [fRoleId],
    [fUserId]
  )  ON [PRIMARY]
GO

ALTER TABLE [dbo].[tSvUser] WITH NOCHECK ADD
  CONSTRAINT [PK_tSvPrjUser] PRIMARY KEY  CLUSTERED
  (
    [fUserId]
  )  ON [PRIMARY]
GO

2、在程序中读取数据,函数是:

static public DataSet GetAdminData(String strDatabaseConnectionString)
{
  DataSet ds;

  SqlConnection sqlConnection = new SqlConnection();
  SqlCommand sqlCommand = new SqlCommand();

  sqlConnection.ConnectionString = strDatabaseConnectionString;
  sqlCommand.CommandText = "[spSvAdminData]";
  sqlCommand.CommandType = System.Data.CommandType.StoredProcedure;
  sqlCommand.Connection = sqlConnection;
  ds = new DataSet();

  sqlConnection.Open();
  SqlDataAdapter adap = new SqlDataAdapter(sqlCommand);

  adap.Fill(ds);
  sqlConnection.Close();

  ds.Tables[0].TableName = "tRole";
  ds.Tables[1].TableName = "tUser";
  ds.Tables[2].TableName = "tObject";
  ds.Tables[3].TableName = "tRoleUser";
  ds.Tables[4].TableName = "tRoleObject";

  return ds;
}

其中调用的stored procedure是:
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[spSvAdminData]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[spSvAdminData]
GO

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS OFF
GO

CREATE PROCEDURE dbo.spSvAdminData AS

SELECT  fRoleId, fRoleName
FROM  tSvRole
ORDER BY fRoleId

SELECT  fUserId, fUserName, fUserEmail
FROM  tSvUser
ORDER BY fUserId

SELECT  fObjectId, fObjectName
FROM  tSvObject
ORDER BY fObjectId

SELECT  fRoleId, fUserId
FROM  tSvRoleUser
ORDER BY fRoleId, fUserId

SELECT  fRoleId, fObjectId, fVisible, fEnable, fExecutable
FROM  tSvRoleObject
ORDER BY fRoleId, fObjectId
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

3、读取权限,判断某User是否可以访问某Object的函数是:

static public bool GetAccessRight(DataSet dsAdmin,
  String tablenameRole, String tablenameUser, String tablenameObject, 
  String tablenameRoleUser, String tablenameRoleObject,
  String fieldnameRole, String fieldnameUser, String fieldnameObject, String fieldnameAccessRight,
  String strUserId, String strObjectId)
{
  int i;
  DataRow[] datarowObjectRoleList;
  datarowObjectRoleList = dsAdmin.Tables[tablenameRoleObject].Select(fieldnameObject+"='"+strObjectId+"'");
  if(datarowObjectRoleList.GetLength(0) == 0)     
    return true;
  for(i=0;i<datarowObjectRoleList.GetLength(0);i++)
  {
    DataRow datarowObjectRole;
    datarowObjectRole = datarowObjectRoleList[i];
    bool boolObjectRoleAccessRight = Convert.ToBoolean(datarowObjectRole[fieldnameAccessRight].ToString());
    if(boolObjectRoleAccessRight == true)
    {
      String strRoleId = datarowObjectRole[fieldnameRole].ToString();
      DataRow[] datarowObjectRoleUa;
      datarowObjectRoleUa = dsAdmin.Tables[tablenameRoleUser].Select(fieldnameRole + "='" + strRoleId + "' AND " + fieldnameUser + "='" + strUserId + "'");
      if(datarowObjectRoleUa.GetLength(0)>0)
        return true;
    }
  }
  return false;
}


这里的规则是:
A、如果此Object没有在Role-Object表中注册,则返回允许;
B、如果此User的任意一个Role在Role-Object表中注册了可访问此Object,则此User可访问此Object
C、否则禁止。

4、使用举例
在User管理页面,使用DataGrid列出User,使用DataGrid的Footer行作为添加User的地方,程序设定只有有“添加User权限”的人才会看到Footer行。如下:

UserGrid.ShowFooter = clsCommon.GetAccessRight(
  dsAdmin, "tRole", "tUser", "tObject", "tRoleUser", "tRoleObject",
  "fRoleId", "fUserId", "fObjectId", "fVisible",
  Session["UserId"].ToString().Trim(), "ObjUserGridFooter");

小结:本方法使用Database与程序结合的方式,实现了Project级别User/Object访问权限的控制。

Project 3:N级魔方阵

魔方阵:由n*n个数字所组成的n阶方阵,具有各对角线,各横列与纵行的数字和都相等的性质,称为魔方阵。而这个相等的和称为魔术数字。若填入的数字是从1到n*n,称此种魔方阵为n阶正规魔方阵。 目标:输入一...
  • He11o_Liu
  • He11o_Liu
  • 2015年02月11日 11:34
  • 600

Project甘特图使用方法

普加甘特图组件分为两个区域:表格区、甘特图区。 拖拽可以调节视图区域大小,如下图: 折叠隐藏视图区域: 添加任务:1.右键菜单:“新增任务”菜单项;2.工具栏:“新增任务”按钮 修改任务:1.右...
  • iPlatForm
  • iPlatForm
  • 2016年02月06日 21:13
  • 12548

project设置工期为1个工作日,但开始时间与结束时间不是同一天,如何解决或者是设置?

这种情况基本是由于开始时间并不是当天早上8:00开始的,检查方法是在“文件-->选项”-->"常规"中可以设置日期的显示格式,如下图,改成显示几点几分钟的格式,然后再检查一下那个开始时间是不是从早上8...
  • mourJava
  • mourJava
  • 2016年08月23日 11:07
  • 17762

Project"网络图"介绍(转)

“网络图”是项目计划的另一种表现形式,网络图中的每个结点代表一项任务,节点之间的连线表示任务之间相关性。与“甘特图”的区别是没有树状的任务分解结构,但是网络图对于明确任务之间的相关性有比较大的优越性。...
  • tantexian
  • tantexian
  • 2015年01月28日 19:44
  • 3528

谈软件开发项目快速编写Project进度计划—2012年CMMI5试点

虽然从事软件项目管理工作多年,但一直不得要领,没有多少感悟。今年,有机会参与CMM5,我带的项目作为试点项目,经过一段时间的磨练,终于有所突破领悟,融汇贯通了点。     工作量估算方法很多,我常...
  • xiaoyw
  • xiaoyw
  • 2013年11月11日 14:51
  • 2194

Project 2013项目管理教程(4):设置资源

任务的完成,离不开人力、物力、财力。这反映到Project中,就是资源。一般的,在绑定任何和资源之前,首先要做的,是明确这个项目总共有哪些资源,这些资源的特性是什么。 首先,切换到资...
  • lifan_3a
  • lifan_3a
  • 2015年03月28日 11:17
  • 1010

Project Server 2016新特性预览——资源需求

“资源需求”这个是Project Server 2016的新功能,名字叫“resource engagement,因为还没有正式的官方说明,我暂且叫”资源需求“吧。 根据我的经验,在研发型/项目型等...
  • accado
  • accado
  • 2015年09月06日 11:45
  • 5548

从什么都不懂开始(二)——创建Project提交到Github需要做什么

背景接上篇,在理解什么是git后,总需要动手操作一下,还是那句话~针对Git很熟练的大牛们可以点击返回或者关闭啦~在看这篇文章之前你得准备好什么?1、注册好的你Gihub账号 2、在setting里...
  • marktheone
  • marktheone
  • 2016年07月27日 16:53
  • 1707

"Project is not a Java project" 之新建Maven项目遇到问题解决方案

Java技术交流欢迎加群:587691476 今早没事在eclipse折腾下Maven,但是新建Maven项目后不能建立java文件名的Source floder文件夹,然后说根据网上教程去Proj...
  • u012831423
  • u012831423
  • 2017年02月17日 14:43
  • 2297

IntelliJ IDEA下project概念和module的概念解释

本文转自: http://note.youdao.com/share/?id=3a1502591870fc1fa9f492056bd95337&type=note ,所有权力归原作者所有。 ...
  • sdujava2011
  • sdujava2011
  • 2015年07月08日 11:57
  • 7628
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Project级别的权限控制
举报原因:
原因补充:

(最多只允许输入30个字)