我们在哪里处理MVC中的权限?在控制器或模型级别?

时间:2011-10-04 15:26:31

标签: java model-view-controller

我正在修改Play! java框架并尝试理解MVC。

考虑这种情况:博客应用程序有版主和用户,两者都可以更新帖子。主持人的更新会立即保存。用户的更新排队等待主持人批准。在MVC中,我们在哪里放置逻辑来确定是更新还是更新更新?

一种方法是在Controller中(伪代码):

public void function update() {
    User user = User.find("byEmail");

    if ( user.isModerator() ) {
        post.update( args );
    }
    else {
        // save post in a temporary table where it awaits approval.
    }
}

我是否正确使用这种方法还是有更好的选择?

1 个答案:

答案 0 :(得分:2)

我知道这是一个很老的问题,但我也有同样的想法 - 所以这可能会有所帮助:

在我当前的项目中,策略是对授权检查进行分层。这样,检查将在最适合的地方完成:

  • 如果对数据的一致性很重要,则在模型中进行检查(非常罕见的情况,需要在API文档中设置!)。
  • 大多数检查都是在控制器级别完成的,因此大多数检查都在一个地方
  • 在“视图”中完成了一些检查(这意味着它们控制了API的JSON输出,这反过来改变了前端的行为)。这些非常罕见,因为它们主要基于从控制器提供的数据,而不是直接查询用户的权限。

我在阅读this帖后想出了解决方案。它提供了一个很好的总结,说明为什么使用控制器是一个好主意 - 以及替代方案。

主要原因是,为什么我选择控制器作为授权检查的地方,它允许模型(及其管理的数据)独立于应用程序逻辑 - 包括授权。

请记住,这完全取决于您想要达到的目标。我只想表明什么对我有用。