我偶然发现了在我的应用程序中访问子实体的不便之处。例如,我的App中有以下实体结构: 公司 - > 投资组合 - > 项目 - > 项目阶段。还有用户实体嵌套在公司实体下,与投资组合具有ManyToMany关系。
每当我尝试访问任何子实体时(例如项目阶段),我必须一直到投资组合实体并检查它是否与当前的用户实体。因此,在子实体的控制器中,我必须使用以下链:
List<User> users = projectStage.getProject().getPortfolio().getUsers();
for (User user : users) {
if(user.equals(currentAuthorizedUser)) {
// allow access to child entity
// break;
}
}
有没有办法自动化这个过程,所以我不需要为层次结构中的每个子实体重复相同的检查集?
答案 0 :(得分:0)
Firstable,您可以使ProjectStage
和Project
使用一种方法实现接口
void checkAccess(User user) throw ForbiddenAccessException;
每个班级必须按照您在上面的代码中定义的那样实施检查。
然后,您可以在控制器中使用action composition。
CheckAccessAction
play.mvc.Action.Simple
loadProjectStage()
,deleteProject()
,updateProject()
...添加@With(CheckAccessAction.class)
call
方法中,您可以检查您尝试访问的对象类型(如果请求中包含currentAuthorizedUser
)如果所有方法都需要,您可以在控制器级别定义@With(CheckAccessAction.class)
。