多租户角色

目前为止,我们已经让用户页面在多租户风格下工作。为使它工作,我们看起来并没有做太多的变化。但请记住,我们正在对一个原来不是多租户的系统作修改。

让我们在 Roles 表应用类似的原则。

再一次,一个租户的用户在不能查看或修改其他租户的角色,每个租户的用户是相互独立工作的。

我们先在 RoleRow.cs 添加 TenantId 属性:

  1. namespace MultiTenancy.Administration.Entities
  2. {
  3. //...
  4. public sealed class RoleRow : Row, IIdRow, INameRow
  5. {
  6. [Insertable(false), Updatable(false)]
  7. public Int32? TenantId
  8. {
  9. get { return Fields.TenantId[this]; }
  10. set { Fields.TenantId[this] = value; }
  11. }
  12. //...
  13. public class RowFields : RowFieldsBase
  14. {
  15. //...
  16. public readonly Int32Field TenantId;
  17. //...
  18. }
  19. }
  20. }

然后,我们在 RoleRepository.cs 做几处修改:

  1. private class MySaveHandler : SaveRequestHandler<MyRow>
  2. {
  3. protected override void SetInternalFields()
  4. {
  5. base.SetInternalFields();
  6. if (IsCreate)
  7. Row.TenantId = ((UserDefinition)Authorization.UserDefinition).TenantId;
  8. }
  9. }
  10. private class MyDeleteHandler : DeleteRequestHandler<MyRow>
  11. {
  12. protected override void ValidateRequest()
  13. {
  14. base.ValidateRequest();
  15. var user = (UserDefinition)Authorization.UserDefinition;
  16. if (Row.TenantId != user.TenantId)
  17. Authorization.ValidatePermission(PermissionKeys.Tenants);
  18. }
  19. }
  20. private class MyRetrieveHandler : RetrieveRequestHandler<MyRow>
  21. {
  22. protected override void PrepareQuery(SqlQuery query)
  23. {
  24. base.PrepareQuery(query);
  25. var user = (UserDefinition)Authorization.UserDefinition;
  26. if (!Authorization.HasPermission(PermissionKeys.Tenants))
  27. query.Where(fld.TenantId == user.TenantId);
  28. }
  29. }
  30. private class MyListHandler : ListRequestHandler<MyRow>
  31. {
  32. protected override void ApplyFilters(SqlQuery query)
  33. {
  34. base.ApplyFilters(query);
  35. var user = (UserDefinition)Authorization.UserDefinition;
  36. if (!Authorization.HasPermission(PermissionKeys.Tenants))
  37. query.Where(fld.TenantId == user.TenantId);
  38. }
  39. }