3

やや典型的な Web アプリケーション用の「ユーザー」オブジェクト モデルを構築したいと考えていますが、オブジェクト モデルとロール システムをどのように設計するのが最善かを判断できません。

基本的に、メンバーシップ プロバイダーのユーザー「ロール」に対応する、約 4 つのユーザー タイプを用意する予定です。

これらのタイプは次のとおりです。 • ワーカー • 雇用者 • ゲスト • 管理者

スーパー タイプは次のとおりです。 • ユーザー

さらに、ユーザーは「労働者」と「雇用者」の両方になる場合があります。

MS ロール & メンバーシップ プロバイダーを使用し、ユーザー ロールに応答するようにナビゲーション UI を設定したいと考えています。

私の質問は次のとおりです。これらのユーザーを柔軟に設計するにはどうすればよいですか (ユーザーは労働者と雇用主になることができます)。ログイン/役割の手順はどのように処理すればよいですか?

(「動作」オブジェクト(労働者の動作、雇用者の動作)のファクトリーを持つユーザーについて考えています)

Login-User ログインの場合、… はそのロールを見つけ、そのサブタイプにキャストします。

これはどのように行われるべきですか?

4

2 に答える 2

3

役割の概念だけを使用することは、私にとって十分であることが常に証明されています. アクセス許可を制御するのに十分なほど低い粒度は提供されません。例として、worker ロールと admin ロールがあり、コードで principal.IsInRole("Admin") を使用してロールをチェックし、何らかの値 (給与など) を変更できるかどうかを判断します。その後、誰かが気が変わって、スーパーバイザーは給与を変更できますが、それでも管理者ではないと言います。ここで、アクセス チェックを変更して、別のロール チェックを追加する必要があります。苦痛で日常的。

そのため、アプリケーション内のすべての機能のリストを作成し、それらをすべてデータベース内のロールに関連付けることができるようにします。アクセス チェックは、principal.HasPermission("CHANGESALARY") のようになります。ログイン時に関連付けられているロールに基づいて、ユーザーのアクセス許可を読み込みます。このようにして、企業は必要な数の機能のグループを作成し、名前を付けることができます。その後、それらは任意のユーザーに適用できます。

カスタム プリンシパル オブジェクトを作成してスレッドにアタッチし、ページのライフ サイクル全体で任意のコードで使用できるようにします。このオブジェクトには、データベースからアクセス許可をロードするためのコードと、アクセス許可を確認するためのメソッドが含まれています。

一般的に、フレームワークの「プロバイダー」は小規模なクラスのアプリケーションには適していて、ほとんどのニーズには不十分だと思います。それらを思い通りに曲げ終えた頃には、最初から書く方が簡単だったでしょう。

于 2009-01-16T23:56:15.763 に答える
1

正直なところ、これはおそらくあまり良い解決策ではありませんが、他のアイデアを生み出すのに役立つかもしれません.

私の役割は、許可の可能な組み合わせのすべてです。

Worker, Employee, Guest, Admin, WorkerEmployee, etc

私のコードには、個々の権限の列挙があります

[Flags]
public enum RolePermissions
{
    Guest = 1,
    Worker = 2,
    Employee = 4,
    Admin = 8
}

データベース内のロールに対応する列挙型があります。整数値は、パーミッションのビットごとの OR です。

public enum AvailableRoles
{
    None = 0,
    Guest = RolePermissions.Guest, //1
    Worker = RolePermissions.Worker, // 2
    Employee = RolePermissions.Employee, // 4
    WorkerEmployee = RolePermissions.Worker | RolePermissions.Employee, // 6
    Admin = RolePermissions.Admin, // 8
}

次に、アクセス許可などを検索するために使用できる一連のメソッドがあります。

// Used to determine if the currently logged in user has a particular permission (Guest, Worker, Employee, Admin)
public static bool UserHasPermission( RolePermissions rolePermssion )
{
    foreach( string role in Roles.GetRolesForUser() )
    {
        AvailableRoles availableRole = Parse( role );

        if( ( (RolePermissions)availableRole & rolePermssion ) == rolePermssion )
            return true;
    }

    return false;
}

// Used to determine whether the currently logged in user is in a specific role
public static bool UserIsInRole( AvailableRoles requestedRole )
{
    return UserIsInRole( Membership.GetUser().UserName, requestedRole );
}

// Used to determine whether a specific user is in a specific role
public static bool UserIsInRole( string username, AvailableRoles requestedRole )
{
    foreach( string role in Roles.GetRolesForUser( username ) )
    {
        AvailableRoles actualRole = Parse( role );

        if( actualRole == requestedRole )
            return true;
    }

    return false;
}

// Helper method to parse enum
private static AvailableRoles Parse( string role )
{
    return (AvailableRoles)Enum.Parse( typeof( AvailableRoles ), role );
}

より良い方法を思いついたり、改善したりした場合は、私に知らせてください。それを自分のコードに組み込むことができます。:-)

于 2009-01-28T17:30:26.257 に答える