每个 属性 的 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"));
我有一个包含大量 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"));