开发者论坛

 找回密码
 注册 (请使用非IE浏览器)
查看: 4054|回复: 0

XAF之Security System (转)

[复制链接]

0

精华

161

贡献

57

赞扬

帖子
112
软币
1615
在线时间
263 小时
注册时间
2013-6-14
发表于 2013-6-19 17:07:21 | 显示全部楼层 |阅读模式
本帖最后由 linuxsc 于 2013-6-19 17:08 编辑

安全系统策略
        XAF的安全系统是用静态类SecuritySystem定义的。终端用户使用XAF程序时,安全系统会检查当前用户是否有足够的权限执行某项操作。
XAF提供了两个内置安全策略:
Simple Security Strategy
       该策略有两个用户类型:用户(user)和管理员(administrator)。user可以访问除User对象外的所有对象。然而,它可以修改自身的密码和其他安全无关的详情。此外,user可以在只读模式下访问User列表。Administrator可以访问全部的对象,此外还可以编辑Application Model。
Complex Security Strategy
      该策略提供了多种用户组,这些组被叫做Role。每个组拥有不同的权限,用户user可以拥有多个Role,即用户的权限可以叠加。user和role的关系是多对多的关系。
XAF的两种认证方式:
Standard  Authentication
标准认证。弹出登录窗口,输入用户名和密码登录。
Active Directory Authentication
活动文件夹认证。程序使用WindowsActiveDirectory服务获取用户信息,然后使用该信息验证用户。若在当前系统找到用户和数据库的对象符合,则通过验证。XAF默认使用这种方式验证。

Complex Security Strategy
1.基本概念
五种操作权限:
SecurityOperations.Create
SecurityOperations.Delete

SecurityOperations.Navigation

SecurityOperations.Read

SecurityOperations.Write
这里要说一下的是SecurityOperations.Navigation权限,当针对的是Type时,表示在导航栏和列表可导航,当针对的是object时,在导航栏不可见,但在列表中可导航。
精细的权限控制,三种权限控制级别:
object-level: 针对具体的对象,一般需要设置对象筛选;
type-level:   针对某种类型,其子类当然也属于该权限范围;
member-level:针对某类型的属性(成员);
三种权限可以组合,构成复杂的权限。
2.实现步骤
2.1  加入安全Model
将Security Strategy Complex和Authentication Standard拖到 WinApplication.cs中。


以下代码需要加入到MySolution.Module | DatabaseUpdate | Updater.cs的UpdateDatabaseAfterUpdateSchema方法中。另外,其中用到的两个自定义函数如下,他们也位于该文件中:
  1.         private void GrantAllAccess(Type type, ref SecurityRole role)
  2.         {
  3.             role.Permissions.GrantRecursive(type, SecurityOperations.Create);
  4.             role.Permissions.GrantRecursive(type, SecurityOperations.Delete);
  5.             role.Permissions.GrantRecursive(type, SecurityOperations.Navigate);
  6.             role.Permissions.GrantRecursive(type, SecurityOperations.Read);
  7.             role.Permissions.GrantRecursive(type, SecurityOperations.Write);
  8.         }
  9.         private void DenyAllAccess(Type type, ref SecurityRole role)
  10.         {
  11.             role.Permissions.DenyRecursive(type, SecurityOperations.Create);
  12.             role.Permissions.DenyRecursive(type, SecurityOperations.Delete);
  13.             role.Permissions.DenyRecursive(type, SecurityOperations.Navigate);
  14.             role.Permissions.DenyRecursive(type, SecurityOperations.Read);
  15.             role.Permissions.DenyRecursive(type, SecurityOperations.Write);
  16.         }
复制代码
2.2 创建各Role和User
  1.             #region 创建Administrator Role
  2.             // If a role with the Administrators name does not exist in the database, create this role
  3.             SecurityRole adminRole = ObjectSpace.FindObject<SecurityRole>(new BinaryOperator("Name", "Administrators"));
  4.             if (adminRole == null)
  5.             {
  6.                 adminRole = ObjectSpace.CreateObject<SecurityRole>();
  7.                 adminRole.Name = "Administrators";
  8.             }
  9.             adminRole.BeginUpdate();
  10.             //Give a permission to edit the Application Model
  11.             adminRole.CanEditModel = true;
  12.             //Provide full access to all objects
  13.             GrantAllAccess(typeof(object), ref adminRole);
  14.             adminRole.EndUpdate();
  15.             //Save the Administrators role to the database
  16.             adminRole.Save();
  17.             #endregion
  18.             #region 创建User Role,从Administrator中减少权限
  19.             // If a role with the "Users" name doesn't exist in the database, create this role
  20.             SecurityRole userRole = ObjectSpace.FindObject<SecurityRole>(new BinaryOperator("Name", "Users"));
  21.             if (userRole == null)
  22.             {
  23.                 userRole = ObjectSpace.CreateObject<SecurityRole>();
  24.                 userRole.Name = "Users";
  25.             }
  26.             userRole.BeginUpdate();
  27.             GrantAllAccess(typeof(object), ref userRole);
  28.             DenyAllAccess(typeof(SecurityUser), ref userRole);
  29.             DenyAllAccess(typeof(SecurityRole), ref userRole);
  30.             DenyAllAccess(typeof(PermissionDescriptorBase), ref userRole);
  31.             DenyAllAccess(typeof(PermissionData), ref userRole);
  32.             DenyAllAccess(typeof(TypePermissionDetails), ref userRole);
  33.             userRole.EndUpdate();
  34.             // Save the "Users" role to the database
  35.             userRole.Save();

  36.             #endregion

  37.             SecurityRole defaultRole = ObjectSpace.FindObject<SecurityRole>(new BinaryOperator("Name", "Default"));
  38.             if (defaultRole == null)
  39.             {
  40.                 defaultRole = ObjectSpace.CreateObject<SecurityRole>();
  41.                 defaultRole.Name = "Default";
  42.                //object-level控制,针对Oid为当前用户id的SecurityUser对象               
  43.               //Allow reading and navigating to the SecurityUser object representing the current user
  44.                 ObjectOperationPermissionData myDetailsPermission = ObjectSpace.CreateObject<ObjectOperationPermissionData>();
  45.                 myDetailsPermission.TargetType = typeof(SecurityUser);
  46.                 myDetailsPermission.Criteria = "[Oid] = CurrentUserId()";
  47.                 myDetailsPermission.AllowNavigate = true;
  48.                 myDetailsPermission.AllowRead = true;
  49.                 myDetailsPermission.Save();
  50.                 defaultRole.PersistentPermissions.Add(myDetailsPermission);
  51.                //Member-level控制,针对SecurityUser的ChangePasswordOnFirstLogon和StoredPassword属性               
  52.                //Allow an access to change the ChangePasswordOnFirstLogon and StoredPassword properties of the
  53.                 MemberOperationPermissionData userMembersPermission = ObjectSpace.CreateObject<MemberOperationPermissionData>();
  54.                 userMembersPermission.TargetType = typeof(SecurityUser);
  55.                 userMembersPermission.Members = "ChangePasswordOnFirstLogon, StoredPassword";
  56.                 userMembersPermission.AllowWrite = true;
  57.                 userMembersPermission.Save();
  58.                 defaultRole.PersistentPermissions.Add(userMembersPermission);
  59.                 //Allow reading and navigating to the SecurityRole object representing the current Role
  60.                 ObjectOperationPermissionData defaultRolePermission = ObjectSpace.CreateObject<ObjectOperationPermissionData>();
  61.                 defaultRolePermission.TargetType = typeof(SecurityRole);
  62.                 defaultRolePermission.Criteria = "[Name] = 'Default'";
  63.                 defaultRolePermission.AllowNavigate = true;
  64.                 defaultRolePermission.AllowRead = true;
  65.                 defaultRolePermission.Save();
  66.                 defaultRole.PersistentPermissions.Add(defaultRolePermission);
  67.                //Type-level控制,针对AuditDataItemPersistent类型               
  68.                //Allow access to the objects of the AuditDataItemPersistent type
  69.                 TypeOperationPermissionData auditDataItemPermission = ObjectSpace.CreateObject<TypeOperationPermissionData>();
  70.                 auditDataItemPermission.TargetType = typeof(AuditDataItemPersistent);
  71.                 auditDataItemPermission.AllowRead = true;
  72.                 auditDataItemPermission.AllowWrite = true;
  73.                 auditDataItemPermission.AllowCreate = true;
  74.                 auditDataItemPermission.Save();
  75.                 defaultRole.PersistentPermissions.Add(auditDataItemPermission);
  76.                
  77.                 defaultRole.Save();
  78.             }


  79.             SecurityUser user1 = ObjectSpace.FindObject<SecurityUser>(new BinaryOperator("UserName", "Sam"));
  80.             if (user1 == null)
  81.             {
  82.                 user1 = ObjectSpace.CreateObject<SecurityUser>();
  83.                 user1.UserName = "Sam";
  84.                 // Set a password if the standard authentication type is used
  85.                 user1.SetPassword("");
  86.             }
  87.             // If a user named 'John' doesn't exist in the database, create this user
  88.             SecurityUser user2 = ObjectSpace.FindObject<SecurityUser>(new BinaryOperator("UserName", "John"));
  89.             if (user2 == null)
  90.             {
  91.                 user2 = ObjectSpace.CreateObject<SecurityUser>();
  92.                 user2.UserName = "John";
  93.                 // Set a password if the standard authentication type is used
  94.                 user2.SetPassword("");
  95.             }


  96.             // Add the "Administrators" Role to the user1
  97.             user1.Roles.Add(adminRole);
  98.             // Add the "Users" Role to the user2
  99.             user2.Roles.Add(userRole);
  100.             user2.Roles.Add(defaultRole);
  101.             // Save the users to the database
  102.             user1.Save();
  103.             user2.Save();
  104.             ObjectSpace.CommitChanges();


  105.             SecurityRole anonymousRole = ObjectSpace.FindObject<SecurityRole>(new BinaryOperator("Name", SecurityStrategy.AdministratorRoleName));
  106.             if (anonymousRole == null)
  107.             {
  108.                 anonymousRole = ObjectSpace.CreateObject<SecurityRole>();
  109.                 anonymousRole.Name = SecurityStrategy.AnonymousUserName;
  110.                 anonymousRole.BeginUpdate();
  111.                 anonymousRole.Permissions[typeof(SecurityUser)].Grant(SecurityOperations.Read);
  112.                 anonymousRole.EndUpdate();
  113.                 anonymousRole.Save();
  114.             }
  115.             SecurityUser anonymousUser = ObjectSpace.FindObject<SecurityUser>(new BinaryOperator("UserName", SecurityStrategy.AnonymousUserName));
  116.             if (anonymousUser == null)
  117.             {
  118.                 anonymousUser = ObjectSpace.CreateObject<SecurityUser>();
  119.                 anonymousUser.UserName = SecurityStrategy.AnonymousUserName;
  120.                 anonymousUser.IsActive = true;
  121.                 anonymousUser.SetPassword("");
  122.                 anonymousUser.Roles.Add(anonymousRole);
  123.                 anonymousUser.Save();
  124.             }
复制代码
另外,也可在运行时创建权限控制策略:
  1. <pre class="csharp" name="code"><pre></pre>
  2. <pre></pre>
  3. <pre></pre>
  4. <pre></pre>
  5. <pre></pre>
  6. <pre></pre>
  7. <pre></pre>
  8. <pre></pre>
  9. <pre></pre>

  10. </pre>
复制代码

评分

参与人数 2贡献 +5 赞扬 +1 收起 理由
maple + 1 很给力
羽叶 + 5 感谢分享

查看全部评分

回复

使用道具 举报

Archiver|手机版|小黑屋|开发者网 ( 苏ICP备08004430号-2 )
版权所有:南京韵文教育信息咨询有限公司

GMT+8, 2024-4-30 21:56

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表