在哪里放置授权代码

Where to place autorisation code

我有一个 PHP MVC 应用程序。业务逻辑在服务层和域模型中实现。我的问题是,我应该在哪里实施授权检查?在服务层?还是领域模型?

在关于服务层模式的讨论中,http://martinfowler.com/eaaCatalog/serviceLayer.html,Martin Fowler 倾向于将 'application logic' 与 'business logic' 分开。前者进入服务层,后者进入领域对象。

我的一些授权规则很复杂。授权可以取决于当前用户、他们的角色、许多其他不相关对象的状态等。这些似乎属于域对象,或者在某些情况下属于这些对象的工厂。

但在其他情况下,规则非常简单。例如,"only a supervisor can approve a new noticeboard post"。在这些情况下,我很想检查服务层中的授权。它消除了安全要求,并且通过将它们放入(可模拟的)服务层侦听器中,我的代码变得更易于测试。

所以,问题是我应该在服务层中放置简单的授权检查,而在域对象中放置更复杂的吗?还是我把它分成两层是自找麻烦?

好的,所以我将身份验证代码移到了服务层,发现只有几个实例我仍然需要在模型中进行额外的检查。为了保持一致性,我也可以将这些检查拉入服务层,但会牺牲性能,但到目前为止我还没有觉得有必要。