2017-03-17 33 views
-2

假設我的模型在用戶使用時具有權限主體,但在業務邏輯使用時不具有權限。將權利管理邏輯放在MVC軟件體系結構中的位置

對於爲例: 當一個創建項目A,它automaticaly創建項目B.如果他想創建一個

用戶必須要創建一個正確或B。 但是,從A創建B時的業務邏輯不需要任何權限。

如果我將正確的系統放在業務邏輯中,我會得到對會話具有強大依賴性的類,如果登錄用戶沒有權限,則A不能創建B.

如果我將權限管理放在控制器中,我覺得我的業務邏輯不安全,因爲任何程序員都可能在創建項目之前忘記測試權限,並且不會停止,而且如果兩個控制器都能夠執行代碼複製出於任何原因更新項目。

你會把權利管理放在哪裏?

我可以創建控制器將使用的每個對象的繼承,並實現權限限制,而業務邏輯可以訪問對象本身。控制器創建UserA,UserB,而對象A直接創建一個B對象。 但是這聽起來像我必須複製(繼承)控制器中必須使用的每個業務邏輯對象,因此其中80%是可靠的。

+0

你應該把你的類的具體例子。它是真的很難理解A和B類。是用戶模型嗎? –

+0

你有中間件嗎?你也可以使用服務來共享代碼 – Farkie

回答

-1

下面是一個例子:

<!-- language: php --> 
//abstact Model 
abstract class Models { 
    public function save() { 
     if($this->id === null) { 
      $this->insert(); 
     } else { 
      $this->update(); 
     } 
    }  

    abstract protected function insert() { 
     //insertion in DB 
    }  

    abstract protected function update() { 
     //update in DB 
    } 
}  


//A Model 
class A extends Model { 
    protected function insert() { 
     //check if logged in user can insert A objects otherwise throw an exception 
     //insert in DB  

     $b = new B; 
     //set $b datas 
     $b->save(); 
    }  

    protected function update() { 
     //check if logged in user can update A objects and has rights on instanciated A otherwise throw an exception 
     //update in DB 
    } 
}  

//B Model 
class B extends Model { 
    protected function insert() { 
     //check if logged in user can insert B objects otherwise throw an exception 
     //insert in DB 
    }  

    protected function update() { 
     //check if logged in user can update B objects and has rights on instanciated B otherwise throw an exception 
     //update in DB 
    } 
}  

//A Controller 
class AController() { 

    public function createA() { 
     $a = new A; 
     //set $a datas 
     $a->save() 
    }  

    public function updateA($id) { 
     $a = new A($id); 
     //set new $a datas 
     $a->save() 
    } 
}  

//B Controller 
class BController() { 

    public function createB() { 
     $b = new B; 
     //set $b datas 
     $b->save() 
    }  

    public function updateB($id) { 
     $b = new B($id); 
     //set new $b datas 
     $b->save() 
    } 
} 

如果我把裏面的模型的驗證,對象一個不能創建對象B,如果用戶不能,但它應該因爲它不是在創造B中的用戶這個例子,它是通過A代碼的商業邏輯。

如果我將模型中的驗證放到控制器中,我將面臨一個程序員,他會忘記驗證,並且當不同控制器更新項目時可能會有很多重複。

到目前爲止,我想過:

  • 在控制器1次Puting權利檢查,但它聽起來並不安全
  • 2注入的用戶,但我必須創建一個「所有權利」用戶將業務邏輯
  • 3使用添加上節省$ norights選項()方法,這將是默認爲false,但設置爲真正的業務邏輯立交橋權利檢查這些想法的

無的全滿足我不同的理由:

  • 1非安全模式如果忘記檢查
  • 2超級用戶聽起來不太好
  • 3聽起來髒
0

我會建議你同樣使用laravel。 Laravel提供了您需要在路由文件中指定的中間件。所以每當任何一個控制器被調用時,都必須先調用中間件,然後所有的條件都會在那裏被檢查,然後它將被轉發給控制器。

在中間件中,您可以創建一個類文件來檢查角色和權限或必要的權限。

您可以參考https://heera.it/laravel-5-1-x-acl-middleware

或可能喜歡https://github.com/Zizaco/entrust#user-relation-to-roles