seaskyer剖析:用户组权限管理
seaskyer剖析:用户组权限管理 1. 用户组权限管理 1.1. 数据库表间关系 ssUser.UserId == UserInfo.UserID UserInfo.GroupID == UserGroup.GroupID UserGroup.GroupPower 从登录信息查 ssUser得到 userID,由 userID查表UserInfo得到GroupID,得到该用户所属权限组。根据GroupID查表UserGroup,得到具体权限 GroupPower 表UserGroup的字段 GroupPower是一个 OLE对象,保存的是二进制的数据,用代码说话就是一个char [] 的数组。具体的内容其实是一个DataTable。该DataTable的具体内容表现在 系统管理界面中的 欢迎页――“欢迎 admin(系统超级管理员) 来到网站管理面板”列出的那个表中的内容。如表1 @Path Add Change Admin RefreshTime Check View Enable FileSize FileType ManagePower usermsc/linkadd.ascx on on usermsc/profileadmin.ascx on post.ascx 1 usermsc/keywordadmin.ascx on usermsc/guestbookadmin.ascx on usermsc/articleadmin.ascx on usermsc/remarkadmin.ascx on usermsc/remarkcheck.ascx on homepage.ascx on usermsc/linkadmin.ascx on show.ascx on usermsc/controlpanel.ascx on linkadmin.ascx on usermsc/changepwd.ascx on usermsc/articleadd.ascx on on otheradmin.ascx on usermsc/polladmin.ascx on newsadmin.ascx on usermsc/topicadmin.ascx on usermsc/keywordadd.ascx on on usermsc/customuserconfig.ascx on usermsc/titlecssadmin.ascx on usermsc/annadmin.ascx on usermsc/polladd.ascx on on usermsc/linksort.ascx on usermsc/linkcheck.ascx on usermsc/annadd.ascx on on usermsc/upload.ascx on 10000 gif,jpg,bmp,png,msi,rar,zip,swf,mp3,wma,wmv,rm,rmvb,htm,txt,js,doc list.ascx on 表格 1权限配置表 从表可以看出,权限的具体表现就是对某页面可以做哪些操作或者相关属性。如页面usermsc/linkadd.ascx,是链接管理,实现了添加Add,更改Change等等操作,于是对该页的操作就有了Add,Change的权限分配。 以这种方式实现权限管理比较灵活。我们可以新增对某页的权限,这时只需要新增一个操作字段。关于权限修改详细讨论见后文。 但是关于用户组的管理还是有个缺陷,一个用户只能隶属一个权限组,还是不太够用!不过还是考虑到了这个问题,在UserInfo表中,有一个UserPower字段,也是保存该用户独有的权限表,也算弥补了些许不足。 1.2. 对表GroupInfo的封装类GroupInfo Seaskyer对几个基本常用的表都封装到了具体的几个类中。以简化操作。 Custom\GroupInfo.cs 文件中实现了类 GroupInfo,专门封装了对表GroupInfo的操作。有两个最重要的方法: GetGroupPowerInfo 根据组ID(GroupID)得到该组的权限表,即上文提到的表1。 GetUserPowerInfo 根据用户ID(UserID)得到该用户所属组的权限表。 1.2.1. GroupInfo. GetGroupPowerInfo 原型:public DataTable GetGroupPowerInfo(string GroupID) 返回值:一个权限分配表DataTable 需要说明的是 seaskyer提供了一个辅助类FormatterHelper,作用就是将DataTable跟二进制数据间进行互相转换,提供了两个方法:Deserialize从表中读出的字段(二进制数据)转换成一个DataTable;Serialize将一个DataTable转换成OLE 对象字段。 函数基本流程: 根据GroupID从表 GroupInfo表读数据库,得到字段GroupPower,二进制数据,用FormatterHelper.Deserialize 方法转换成 DataTable。 1.2.2. GroupInfo .GetUserPowerInfo 原型:public DataTable GetUserPowerInfo(string UserID) 返回值:一个权限分配表DataTable 函数基本流程: 根据UserID读表UserInfo,得到 GroupID,UserPower,如果UserPower有冬冬,就用这个表作为用户的权限分配表,如果没有,则根据GroupID,调用GetGroupPowerInfo得到组的权限表。以此返回。 有了GroupInfo类,在Seaskyer.WebApp.Utility. userPower类的辅助下,可以比较方便的对用户权限加以管理了。 1.3. Seaskyer.WebApp.Utility. userPower类 用户权限系统配置信息。 首先从数据库中得到用户权限配置信息。具体方法就是:LoadFromDataTable public void LoadFromDataTable(DataTable dt) 参数就是通过 GroupInfo 的方法得到的权限配置表了。何时调用LoadFromDataTable方法的?index.aspx.cx 中baseCommon_Load 事件中。 当 userPower加载了数据权限配置表后,就可以用些方法来检查用户权限了。具体也就是几个方法: public string GPV(string path, string powerName) 获取指定页的权限值 public string GPV(string powerName) 获取当前页的权限值 public bool GPB(string path, string powerName) 获取指定页的权限值(布尔值) public bool GPB(string powerName) 获取当前页的权限值(布尔值) 调用举例: Homepage.ascx.cs private void Page_Load(object sender, System.EventArgs e) { if( !power.GPB("View") ) //查看当前用户是否具有view的权限。 { base.strError.Add(lang["sharePage", "denyViewErrorInfo"]); return; } ... } AtricleAdd.ascx.cs if( !power.GPB("Add") ) //检查当前用户是否具有添加的权限 { base.strError.Add(lang["sharePage", "denyViewErrorInfo"]); return; } 1.4. 权限使用小结 至此讨论了从数据库读取权限配置信息并在具体页面对当前用户进行检查的过程。简述如下: Index.aspx.cs 中,当baseCommon_Load事件发生时。通过 GroupInfo封装类读取数据库,得到权限配置表,然后将该表的引用赋给userPower,并缓存。 当需要检查用户权限的时候,通过userPower提供的几个方法,检查对页面的访问权限。 在页面ArticleAdmin中实现Check的动作,及如果用户提交的动作是Check时我们实现具体的业务逻辑。 在PowerItem.aspx |