2017-03-17 64 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