每个 属性 的 CSLA 授权

CSLA authorization per property

我有一个包含大量 PropertyInfo 的 BusinessBase。它有一个 AuthorizationAction.EditObject,所有用户都可以更改它。但是有些用户可以访问不同的字段。

User A can update all properties.
User B can only update one property.

有没有办法让一个规则在每次 属性 更改时执行?为每个 属性 写一个 AuthorizationAction.WriteProperty 会很长,如果有人添加 属性 并忘记规则,将来可能会导致错误。

如果我别无选择,也许有一种方法可以查看给定类型的所有 IMemberInfo。

#csla 支持您编写自定义授权 (authz) 规则 classes。您可以将一个 authz 规则附加到一个 属性,许多属性可以使用相同的规则。

听起来您需要编写一条规则来区分“用户 A”和“用户 B”,并将该规则附加到属性以控制当前用户是否可以更新 属性 .

这当然过于简单化了,但规则有点像这样:

  public class UserAUserBRule : Csla.Rules.AuthorizationRule
  {
    private readonly List<string> users;

    public UserAUserBRule(Csla.Core.IPropertyInfo property, params string[] users)
      : base(AuthorizationActions.WriteProperty, property)
    {
      this.users = users.ToList();
    }

    protected override void Execute(IAuthorizationContext context)
    {
      var username = Csla.ApplicationContext.User.Identity.Name;
      context.HasPermission = users.Contains(username);
    }
  }

在您的域 class 的 AddBusinessRules 方法中使用,如下所示:

      BusinessRules.AddRule(new UserAUserBRule(FirstNameProperty, "UserA"));
      BusinessRules.AddRule(new UserAUserBRule(LastNameProperty, "UserA"));
      BusinessRules.AddRule(new UserAUserBRule(CityProperty, "UserA", "UserB"));