权限管理工具的使用
在当今商业软件的开发中有一项功能是必不可少的 , 这就是权限工具 , 想必大家对权限这个词不会太陌生 , 应为在我们身边的很多软件上都用到了权限 , 比如说最常见的 Windows 操作系统,就使用到了权限,但是在实际的开发过程中,权限是个相当麻烦的东西。大家都在寻找一种简易的权限管理方式,这个时候我们发现了 CG . Security 这个组件,这是一个非常优秀的功能权限管理组件,它可以让我们非常简便的来控制软件的权限。
使用 CG . Security 你可以任意添加删除权限、角色和权限。可以通过大多数的权限管理方式给用户赋予角色或直接给用户赋予权限。
好了,简短介绍了 CG . Security 的功能后下面将为大家来讲解下该组件的用法。在讲解之前请首先到 http://www.codeproject.com/csharp/CGSecurity.asp 上下载该组件。
下面的讲解会分两个部分:
第一部分将讲解该类库中常见的一些方法属性的用法。第二部分通过一个小 DEMO ,给大家一个感性的认识,让大家了解在实际开发中如何使用 CG . Security 。
** 一、 ** ** 类库的常用方法 ** ** **
在这个组件中用了六个类来分别实现了用户管理、权限管理和角色管理。
UserManager (用户管理类):该类提供了添加、删除和查找用户的方法。
RoleManager (角色管理类):该类提供了添加、删除和查找角色的方法。
RightManager (权限管理类):该类提供了添加、删除和修改权限的方法。
UserRightManager (用户权限管理类):该类的作用是使用户和权限关联,也提供了增、删、查的功能,使用此类,可以为某个用户直接赋予权限。
UserRoleManager (用户角色管理类):该类和上面的 UserRightManager 相似,也提供了相似的功能,所不同的是该类是把用户和角色进行关联。
RoleRightManager (角色权限管理类)该类提供了角色和权限关联的功能。
在介绍了上述六个类后,下面还要为大家介绍在实际开发中会用到的一个类。
SecurityManager.cs 类,该类提供了登陆验证( Authenticate )和获得该用户权限列表( EffectiveRights )的功能。使用该类我们可以判断用户的合法性并且能得到当前用户的权限列表。
上面介绍了权限管理组件中几个常见类的功能。让大家对权限管理组件有一个全面的了解,下面的一部分我将一步一步做出一个小 DEMO 让大家对这个组件有一个感性的认识。 OK ,偶们进入下一环节吧。
** 二、 ** ** 做一个小 ** ** Demo ** ** 来演示如何使用这个权限工具 ** ** **
1. 首先我们要从网上下载该组件,该组件可以从 http://www.codeproject.com/csharp/CGSecurity.asp 上找到,在下载后在 bin/release 目录下找到 CG.Security.dll 文件。
2 .新建一个解决方案 CGTest 。
3 .然后在 Form1 上添加 12 个按钮分别为 btnAddUser 、 btnDelUser 、 btnAddRole 、 btnDelRole 、 btnAddRight 、 btnDelRight 、 btnAddUserRole 、 btnDelUserRole 、 btnAddRoleRight 、 btnDelRoleRight 、 btnAddUserRight 、 btnDelUserRight 。
上述 12 个按钮大家从字面上都可以了解到是什么含义。在这里还要添加一个 checkbox ,命名为 cbUserRight 。
4 .在添加完按钮后我们再在 Form1 上添加 6 个 DataGrid 分别命名为 dgUser 、 dgRole 、 dgRight 、 dgRoleRight 、 dgUserRole 、 dgUserRight 。这六个按钮分别显示出了 6 个数据表里面的数据。经过 3 、 4 两个步骤后我们的程序的管理权限部分就添加完成了,但是做了管理权限后我们如何来使用这个权限呢?下面一步将向大家介绍如何来控制权限。
5 .我们可以在界面上添加两个个按钮 btnTestAll , btnTestSingle 。 btnTestAll 是所有人都能操作的,但是 btnTestSingle 则是拥有某个权限的人才能操作的。
6 .上面添加的是我们的主界面,下面我们还要添加一个用来输入用户名密码等信息的辅助界面,在工程上添加一个新的 Windows 窗体,然后命名为 FormValue 。当窗体新建好后在窗体上新建 textbox 、 button 一样两个。 textbox 分别命名为 txtName , txtPwd , button 分别命名为 btnOK , btnCancel 。并且把 btnOK 的 dialogresult 属性设置为 OK , btnCancel 的 dialogresult 属性设置为 Cancel 。窗体设置完后我们在代码中添加两个属性
public string UID
{
get { return txtName . Text . Trim();}
}
public string PWD
{
get { return txtPWD . Text . Trim();}
}
7 . 首先在项目种引用 CG.Security.dll 这个组件。在 FORM1 上导入 CG . Security 和 CG . Security . Principal 这两个命名空间。
using CG . Security;
using CG . Security . Principal;
8. 在添加完引用后。我们还有两个东西要准备,数据库和程序的配置文件配置文件,数据库大家可以在该组件 Demo 的 Database 目录下找到 security.mdb 这个文件,把该文件 Copy 到我们 CGTest 项目的 Debug 目录下。搞定数据库后下面我们还要添加一个配置文件,那么首先我们添加一个新的 App.Config ,然后 Copy 下列代码到 App.Config 中:
< configuration >
< configSections >
< sectionGroup name ="CG.Security.Data">
< section name ="runtimeSetup" type ="CG.Security.Data.Configuration.DataSettingsHandler, CG.Security" /> < CG.Security.Data >
< runtimeSetup defaultSection ="Access">
< installedAssembly >
< add
sectionName ="Access"
targetAssembly ="CG.Security"
targetNamespace ="CG.Security.Data.Access"
connectionString ="Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=security.mdb;Mode=Share Deny None;Extended Properties="";Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt atabase=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False" ¸
/> 上述的配置文件大家可以看到是连接数据库的一些信息,他使用到了 CG.Security.Data.Configuration.DataSettingsHandler 这个类来读取数据库信息,在配置文件中我们可以很清楚的看到连接字符串,该配置文件使用 Oledb 连接到当前目录下的 Access 数据库。所以我们把数据库放到 bin/dubug 目录下。当一切配置都完成了的时候,我们就开始实现具体的代码了。
9. 首先我们要实现添加删除用户、角色权限的代码。
首先我们来看看怎么添加一个用户
private void btnAddUser_Click( object sender, System . EventArgs e)
{
FormValue fv = new FormValue();
if (fv . ShowDialog( this ) != DialogResult . OK)
{
return ;
}
UserManager . Create(fv . UID,fv . PWD);
Reflash();
}
上述代码使用了 UserManager 类的 Create 方法,该方法接受 2 个参数用户名和密码,当调用了该方法后我们就可以创建一个用户了。
那么有添加肯定就有删除的方法了我们在 btnDelUser 的单击事件中实现如下的代码。
private void btnDelUser_Click( object sender, System . EventArgs e)
{
UserManager . Delete((Int32)UserManager . FindAll() . Tables[ 0 ] . Rows[dgUser . CurrentRowIndex][ "user_id" ]);
// 刷新 dg 的显示
Reflash();
}
大家可以看到当删除的时候传入的是一个整型数,该整型