根据父实体限制限制对子实体的访问

时间:2014-04-07 11:33:44

标签: rest playframework-2.0

我偶然发现了在我的应用程序中访问子实体的不便之处。例如,我的App中有以下实体结构: 公司 - > 投资组合 - > 项目 - > 项目阶段。还有用户实体嵌套在公司实体下,与投资组合具有ManyToMany关系。

每当我尝试访问任何子实体时(例如项目阶段),我必须一直到投资组合实体并检查它是否与当前的用户实体。因此,在子实体的控制器中,我必须使用以下链:

List<User> users = projectStage.getProject().getPortfolio().getUsers();
for (User user : users) {
    if(user.equals(currentAuthorizedUser)) {
        // allow access to child entity
        // break;
    }
}

有没有办法自动化这个过程,所以我不需要为层次结构中的每个子实体重复相同的检查集?

1 个答案:

答案 0 :(得分:0)

Firstable,您可以使ProjectStageProject使用一种方法实现接口

void checkAccess(User user) throw ForbiddenAccessException;

每个班级必须按照您在上面的代码中定义的那样实施检查。

然后,您可以在控制器中使用action composition

  1. 创建扩展CheckAccessAction
  2. 的操作play.mvc.Action.Simple
  3. 在每个需要访问权限检查的方法之前,例如loadProjectStage()deleteProject()updateProject() ...添加@With(CheckAccessAction.class)
  4. 在操作合成的call方法中,您可以检查您尝试访问的对象类型(如果请求中包含currentAuthorizedUser
  5. 如果所有方法都需要,您可以在控制器级别定义@With(CheckAccessAction.class)