当前位置:文档之家› 用户权限管理设计方案

用户权限管理设计方案

盛年不重来,一日难再晨。

及时宜自勉,岁月不待人。

用户权限管理设计方案用户认证管理设计方案1 设计思路为了设计一套具有较强可扩展性的用户认证管理,需要建立用户、角色和权限等数据库表,并且建立之间的关系,具体实现如下。

1.1 用户用户仅仅是纯粹的用户,用来记录用户相关信息,如用户名、密码等,权限是被分离出去了的。

用户(User)要拥有对某种资源的权限,必须通过角色(Role)去关联。

用户通常具有以下属性:✓编号,在系统中唯一。

✓名称,在系统中唯一。

✓用户口令。

✓注释,描述用户或角色的信息。

1.2 角色角色是使用权限的基本单位,拥有一定数量的权限,通过角色赋予用户权限,通常具有以下属性:✓编号,在系统中唯一。

✓名称,在系统中唯一。

✓注释,描述角色信息1.3 权限权限指用户根据角色获得对程序某些功能的操作,例如对文件的读、写、修改和删除功能,通常具有以下属性:✓编号,在系统中唯一。

✓名称,在系统中唯一。

✓注释,描述权限信息1.4 用户与角色的关系一个用户(User)可以隶属于多个角色(Role),一个角色组也可拥有多个用户,用户角色就是用来描述他们之间隶属关系的对象。

用户(User)通过角色(Role)关联所拥有对某种资源的权限,例如●用户(User):UserID UserName UserPwd1 张三xxxxxx2 李四xxxxxx……●角色(Role):RoleID RoleName RoleNote01 系统管理员监控系统维护管理员02 监控人员在线监控人员03 调度人员调度工作人员04 一般工作人员工作人员……●用户角色(User_Role):UserRoleID UserID RoleID UserRoleNote1 1 01 用户“张三”被分配到角色“系统管理员”2 2 02 用户“李四”被分配到角色“监控人员”3 2 03 用户“李四”被分配到角色“调度人员”……从该关系表可以看出,用户所拥有的特定资源可以通过用户角色来关联。

1.5 权限与角色的关系一个角色(Role)可以拥有多个权限(Permission),同样一个权限可分配给多个角色。

例如:●角色(Role):RoleID RoleName RoleNote01 系统管理员监控系统维护管理员02 监控人员在线监控人员03 调度人员调度工作人员04 一般工作人员工作人员……●权限(Permission):PermissionID PermissionName PermissionNote0001 增加监控允许增加监控对象0002 修改监控允许修改监控对象0003 删除监控允许删除监控对象0004 察看监控信息允许察看监控对象……●角色权限(Role_Permission):RolePermissionID RoleID PermissionID RolePermissionNote1 01 0001 角色“系统管理员”具有权限“增加监控”2 01 0002 角色“系统管理员”具有权限“修改监控”3 01 0003 角色“系统管理员”具有权限“删除监控”4 01 0004 角色“系统管理员”具有权限“察看监控”5 02 0001 角色“监控人员”具有权限“增加监控”6 02 0004 角色“监控人员”具有权限“察看监控”……由以上例子中的角色权限关系可以看出,角色权限可以建立角色和权限之间的对应关系。

1.6 建立用户权限用户权限系统的核心由以下三部分构成:创造权限、分配权限和使用权限。

第一步由Creator创造权限(Permission),Creator在设计和实现系统时会划分。

利用存储过程CreatePermissionInfo(@PermissionName,@PermissionNote)创建权限信息,指定系统模块具有哪些权限。

第二步由系统管理员(Administrator)创建用户和角色,并且指定用户角色(User-Role)和角色权限(Role-Permission)的关联关系。

1)Administrator具有创建用户、修改用户和删除用户的功能:●存储过程CreateUserInfo(@UserName,@UserPwd)创建用户信息;●存储过程ModifyUserInfo(@UserName,@UserPwd)修改用户信息;●存储过程DeleteUserInfo(@UserID)删除用户信息;2)Administrator具有创建角色和删除角色的功能:●存储过程CreateRoleInfo(@RoleName,@RoleNote)创建角色信息;●存储过程DeleteRoleInfo(@RoleID)删除角色信息;3)Administrator具有建立用户和角色、角色和权限的关联关系功能:●存储过程GrantUserRole(@UserID,@RoleID,@UserRoleNote)建立用户和角色的关联关系;●存储过程DeleteUserRole(@UserRoleID)删除用户和角色的关联关系;●存储过程GrantRolePermission(@RoleID,@PermissionID,@RolePermissionNote)建立角色和权限的关联关系;●存储过程DeleteRolePermission(@RolePermissionID)删除角色和权限的关联关系;第三步用户(User)使用Administrator分配给的权限去使用各个系统模块。

利用存储过程GetUserRole(@UserID, @UserRoleID output),GetRolePermission (@RoleID,@Role--PermissinID output)获得用户对模块的使用权限。

if (sHeader == null)return "ERROR: Please supply credentials";elsereturn "USER: " + ername;}然后,客户端在调用要求标头的方法之前,直接在代理类上设置标头,如下面的示例所示:HeaderService h = new HeaderService();AuthHeader myHeader = new AuthHeader();ername = "username";myHeader.Password = "password";h.AuthHeader = myHeader;String result = h.SecureMethod();3.2 .Net Remoting的安全认证方式CallContext提供与执行代码路径一起传送的属性集,CallContext是类似于方法调用的线程本地存储的专用集合对象,并提供对每个逻辑执行线程都唯一的数据槽。

数据槽不在其他逻辑线程上的调用上下文之间共享。

当CallContext 沿执行代码路径往返传播并且由该路径中的各个对象检查时,可将对象添加到其中。

当对另一个AppDomain 中的对象进行远程方法调用时,CallContext 类将生成一个与该远程调用一起传播的LogicalCallContext 实例。

只有公开ILogicalThreadAffinative 接口并存储在CallContext 中的对象被在LogicalCallContext 中传播到AppDomain 外部。

不支持此接口的对象不在LogicalCallContext 实例中与远程方法调用一起传输。

CallContext.SetData方法存储给定对象并将其与指定名称关联,CallContext.GetData方法从CallContext 中检索具有指定名称的对象。

下面的代码示例说明如何使用SetData 方法将主体和标识对象传输到远程位置以进行标识。

public class ClientClass {public static void Main() {GenericIdentity ident = new GenericIdentity("Bob"); GenericPrincipal prpal = new GenericPrincipal(ident, Newstring[] {"Level1"});LogicalCallContextData data =new LogicalCallContextData(prpal);//Enter data into the CallContextCallContext.SetData("test data", data);Console.WriteLine(data.numOfAccesses);ChannelServices.RegisterChannel(new TcpChannel()); RemotingConfiguration.RegisterActivatedClientType(typeof(HelloServiceClass),"tcp://localhost:8082");HelloServiceClass service = new HelloServiceClass();if(service == null) {Console.WriteLine("Could not locate server.");return;}// call remote methodConsole.WriteLine();Console.WriteLine("Calling remote object");Console.WriteLine(service.HelloMethod("Caveman")); Console.WriteLine(service.HelloMethod("Spaceman")); Console.WriteLine(service.HelloMethod("Bob"));Console.WriteLine("Finished remote object call");Console.WriteLine();//Extract the returned data from the call contextLogicalCallContextData returnedData =(LogicalCallContextData)CallContext.GetData("tes t data");Console.WriteLine(data.numOfAccesses);Console.WriteLine(returnedData.numOfAccesses);}}下面的代码示例说明如何使用GetData 方法将主体和标识对象传输到远程位置以进行标识。

相关主题