在哪里放置自动化代码


Where to place autorisation code

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

http://martinfowler.com/eaaCatalog/serviceLayer.html,在关于服务层模式的讨论中,Martin Fowler更喜欢将"应用程序逻辑"与"业务逻辑"分开。 前者进入服务层,后者进入域对象。

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

但在其他情况下,规则非常简单。 例如,"只有主管才能批准新的公告板帖子"。 在这些情况下,我很想检查服务层的授权。 它消除了安全要求,并且通过将它们放在(可模拟的)服务层侦听器中,我的代码变得更容易测试。

那么,问题是我应该在服务层中放置简单的授权检查,而在域对象中放置更复杂的授权检查吗? 还是我通过将其分成两层来自找麻烦?

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