对象模型授权 - 面向对象设计问题

时间:2009-08-05 15:09:37

标签: design-patterns oop domain-driven-design

背景 每个项目都有一个与之关联的帐户。每个用户都可以拥有访问零到多个帐户的权限。这反过来意味着每个用户只能根据用户的帐户权限访问项目子集。

用户登录应用程序时会加载User对象,并且此时也会加载帐户权限。该User对象存储在应用程序的缓存中。项目根据需要加载。

问题 强制执行帐户限制的最佳方法是什么?我们希望它从实际的表示逻辑中抽象出来,但我们认为将授权逻辑放在Project对象中并不一定是一种好方法,因为它依赖于User对象。你们觉得怎么样?

示例:(后面的aspx页码)

Project oProject = New Project(projectId); //Pass an Int32 here
if (oProject.Load()) //This operation needs to check user permissions somehow
{ /* Do stuff */ }

2 个答案:

答案 0 :(得分:1)

然后也抽象掉用户对象。将用户对象转换为可以使用项目中的标准接口查询的权限集合。

答案 1 :(得分:1)

您可以实现一个负责验证项目权限的类(即权限检查逻辑是否存在于项目之外);例如在Java中:

public interface EntitlementsManager {
   void checkProjectPermission(String userName, int projectId) throws SecurityException;
}

然后在您的代码中,您只需在业务层添加对checkProjectPermission的调用,然后再将结果传递回您的表示层。虽然这是一个相当程序性的(即非OO)方法,但是很明显,因为所有基于权限的逻辑都在一个类中。基于异常的方法也意味着代码中的if-then语句更少。