これらの役割を「そのまま」とし、ここでの役割のリストがすべてそれらのものであると仮定すると、これをフラグベースの列挙型に変換し、役割の集合の表現を整数としてdbに格納できます。ここで
は、あなたが「RoleFlags」を持つことができ、これを使用して...私のビジネスロジックにこれを適用するとき、私のようなものを言うことができ
public enum Role
{
Finance = 1
General = 2
SquadLeader = 4
Management = 8
SystemAdmin = 16
}
...それがうまくいくかもしれない方法です
var genAndSysAdmin = 18;
var genAndSysAdminFlags = Role.General || SystemAdmin;
ユーザーオブジェクトのタイプ「役割」の変数と
User.Roles.HasFlag(Role.Management)
...のようなチェックがない...ユーザーがGIVであるかどうかをチェックしますenロール。あなたの例では言い換えれば 彼らは、フラグ値が...
var allRoles = 16 + 8 + 4 + 2 + 1;
だろうシステム管理者を持っている場合、ユーザは他のすべての役割を持っている場合...基本的にこれは単純なビットマップのように動作します。
どのように!
このようにセキュリティモデルを設計することはお勧めできません。
代わりに、通常のロール構造を作成する必要がありますが、ロールには子ロールのコレクションと親ロールを持たせる必要があります。これは、LDAP/Active Directoryの種類の設定のようなものを作品より典型的な設計を可能にする
...
public class Role
{
[Key]
public Guid Id { get; set; }
[ForeignKey("Parent")]
public Guid ParentId { get; set; }
[Required]
public string Name { get; set; }
public virtual Role Parent { get; set; }
public ICollection<User> Users { get; set; }
public ICollection<Role> Children { get; set; }
}
public class User
{
[Key]
public Guid Id { get; set; }
...
public ICollection<Role> Roles { get; set; }
}
このように、我々のセットアップ我々のデータを...
new Role { Id = 1, Name = "SystemAdmin" }
new Role { Id = 2, Name = "Management", ParentId = 1 }
new Role { Id = 3, Name = "SquadLeader", ParentId = 2 }
...
。 ..この方法で作業することで、任意の親ロール内のすべての子ロールの権限のレベルを柔軟に継承できます。また、より典型的なパターンを採用しながら、シミュレートしようとしている階層のようなアクセス権を扱うことができます。将来、新しい役割を追加する。
出典
2017-07-01 08:49:17
War
組み込みのクラスでは、いいえ、方法はありません。あなたは独自の実装を作成する必要があります –
ありがとう、@CamiloTerevinto。私はそれを恐れていた – Alex
残念ながら、組み込みのクラスは非常に限られています。私は自分のStore/User/Roleの実装を書いている時代のほとんどを自分で見つけました。 –