2011-12-09 22 views
2

TaskListというオブジェクトがあり、所有者だけが編集して削除できるオブジェクトがあるとします。他のユーザーは、タスクを実行してそのステータスを更新することによってしか対処できません。DDD内のオブジェクトの所有者へのアクセスを制限する

次のオプションは、私の心に来る:

  • Webアプリケーション
  • のコントローラで所有権とアクセス権を確認します(特定の操作上の例外をスローするリポジトリリターンプロキシオブジェクトをさせたが、コントローラ(リンクまたはフォームフィールドの形式で)表示する必要があるかどうかを知る必要があります。
  • ドメインオブジェクトのメソッドに呼び出し元(ユーザー)を渡すので、ドメインオブジェクトは呼び出し元istは許可されているかどうか。

使用されるテクノロジはJavaです。

他の/良いアイデアですか?

それは私が実際に使用するものですので、私は、今、私自身の答えを受け入れてきたセキュリティおよびDDD Springフレームワーク

  • Security in Domain-Driven Design
  • 答えて

    0

    「グレー」で示唆されているように、保護されたドメインクラスごとにアクセサークラスを作成することは不必要に複雑であることがわかりました。私のソリューションはおそらく完璧ではないが、使いやすく、より重要なのは堅牢だ。特定のオブジェクトを使用したり、外部の状態をチェックすることを忘れることはできません。

    public class TaskList { 
    
        private SystemUser owner; 
        private List<Task> tasks = new ArrayList<>(); 
    
        public TastList(SystemUser owner) { 
         this.owner = owner; 
        } 
    
        public void Add(Task task) { 
         Guard.allowFor(owner); 
         tasks.add(task); 
        } 
    } 
    

    Guardは、(例えば、ローカルスレッドから)現在のユーザーを知っており、allowFor(owner)にパラメータとして渡さ所有者と比較します。アクセスが拒否された場合、セキュリティ例外がスローされます。

    基本的な認証が変更された場合、ガードだけを変更する必要があるため、これは簡単で堅牢で、維持管理も簡単です。

    2

    私は所有権/アクセス許可モデルをTaskListドメインオブジェクトにエンコードしません。そのようなビジネスロジックは外部にあるべきです。私はプロキシオブジェクトのアイデアも気に入らない。確かに動作しますが、デバッグが混乱し、少なくともこの場合は不必要に複雑になります。私はコントローラでもチェックしません。

    代わりにTaskListのアクセス許可を監督するビジネスロジックオブジェクトを作成します。だから、TaskListは、所有者フィールドを持っているでしょうが、あなたのようなものだろう:あなたは、あなたが作成する唯一のものであるファクトリクラスを作成することができTaskListオブジェクト上のすべての操作は、アクセサを通過することを要求する必要がある場合は

    public class TaskListAccessor { 
        private TaskList taskList; 
        private User reader; 
    
        public void updateStatus(Status status) { 
         // everyone can do this 
         taskList.updateStatus(status); 
        } 
    
        /** Return true if delete operation is allowed else false */ 
        public boolean isDeleteAllowed() { 
         return taskList.getOwner().equals(reader); 
        } 
    
        /** Delete the task. Only owners can do this. Returns true if worked else false */ 
        public boolean delete() { 
         if (isDeleteAllowed()) { 
          taskList.delete(); 
          return true; 
         } else { 
          return false; 
         } 
        } 
        // ... other accessors with other is*Allowed methods 
    } 
    

    をパッケージコンストラクタなどを使用してTaskList DAOを使用してデータストアからTaskListを検索する唯一の工場が工場かもしれません。

    しかし、このように制御するメソッドが多すぎると、プロキシが簡単になる可能性があります。両方のケースでは、TaskListを持つことが推奨されます。実装クラスはプロキシまたはアクセサーによって隠されています。

    関連する問題