1

ユーザーの役割が異なるアプリケーション(Webアプリケーション)で使えるデザインパターンを教えてください。私のアプリケーションには、管理者、人事、マネージャー、アシスタントマネージャー、およびスタッフがいます

管理者には、Web アプリケーションのすべてのページにアクセスする権限があります HR には、ページ 1 とページ 2 などのいくつかのページにのみアクセスする権限しかありません (管理者は、将来、より多くのページに特権を追加できることに注意してください) マネージャー - マネージャーは、対応するスタッフを表示できます

上記の機能を実装するための設計パターンはありますか。今後、さらに多くのユーザー ロールとページが追加される可能性があるため

ありがとう

4

4 に答える 4

4

一般に、ユーザー ロールを設計する場合は、Decorator パターンが適切なソリューションです。

于 2012-09-28T13:01:28.520 に答える
1

ページ レベルでアクセスをブロックしている場合は、いずれかのセキュリティ フレームワーク (Spring Security など) で必要なものがすべて見つかります。

特定の機能へのアクセスをロックできるようにする場合は、いくつかのオプションがあります。

これらのオプションのほとんどでは、役割を使用するのではなく、権限を使用する方が適切です。ロールには複数の権限を付与できます。これにより、多くの柔軟性が可能になります。

いくつかの MVC 派生物を見ることができます。そこにあるコントローラーのメソッドを保護できます。各機能を権限にマップできます。

これをコマンド パターンと組み合わせると、このレベルでセキュリティを追加できます。次に、アクセス許可が 1 対 1 でコマンドにマップされます。これにより、UI コントロールに現在のユーザーの権限を反映させることが非常に簡単になります。(Delphi と Spring のアクションを参照

この最後のオプションは、私にとって最も美しく、使いやすいものです。

于 2012-09-28T10:28:30.560 に答える
0

これが非常に古い投稿であることは知っていますが、同じ答えを探していて、受け入れられる答えが見つかりませんでした. 最初は Decorator パターンが最も明白に思えますが、すべてのロールが同じメソッドを実装する必要があるため、これは実際には私が望んでいたものではありません (そうでなくても、顧客に BlockUserAccount() メソッドを持たせたいですか?) )、新しい動作が実装されるたびに、すべての役割を拡張する必要があります。

代わりに、実験を通じて、委任パターンのバリエーションが最適であるように思われることがわかりました。Delegation パターンについて読んだことはすべてメイン オブジェクトのスーパークラスに関係しているため、「バリエーション」と言いますが、それは私が最終的に行ったことではありません。

私が行ったことは、基本的なユーザー オブジェクトを使用することであり、ロールのコレクションが含まれています。これらのロールは、それぞれが独自のメソッドを持ち、それぞれが独自のインターフェイスを持つ、まったく異なるタイプのクラスとして定義されます。その後、必要に応じてロールが委任されます。

public interface ICustomerAlaCarte 
{
    void AuthorizePayment(decimal paymentAmount); 
}

public abstract class UserRole { }

public class CustomerAlaCarte : UserRole, ICustomerAlaCarte 
{
    public void AuthorizePayment(decimal paymentAmount) 
    {
        // Logic here
    } 
}

public class User
{
    private List<UserRole> _userRoles;

    public void AddUserRole(UserRole newRole)
    {
        _userRoles.Add(newRole);
    }

    public ICustomerAlaCarte AsAlaCarteCustomer()
    {
        ICustomerAlaCarte alaCarteRole = _userRoles.OfType<ICustomerAlaCarte>().FirstOrDefault();

        if (alaCarteRole != null)
        {
            return alaCarteRole;
        }
        else
        {
            throw new UserRoleNotAssignedException(); // Custom exception
        }
    }
}

次に使用します:

var user = new User();
user.AddUserRole(new CustomerAlaCarte());

ICustomerAlaCarte customer = user.AsAlaCarteCustomer();
customer.AuthorizePayment(9.99);

このパターンを使用すると、ロールをネストすることもできます。たとえば、ユーザー管理者とレポート管理者を持つことができ、それぞれが管理者から継承されます。基本的な管理機能 (または ID) のみが必要な場合は、管理デリゲートをプルしますが、前述の BlockUserAccount() の動作に IUserAdmin を指定することもできます。これは、各ロールに意味のあるメソッドしかないためです。

于 2019-03-14T13:28:26.030 に答える