2009-08-05 80 views
1

背景 每个项目都有一个与其关联的帐户。每个用户都可以有权访问零到多个帐户。这又意味着每个用户只能根据用户的帐户权限访问项目的子集。对象模型授权 - OO设计问题

当用户登录到应用程序时,用户对象被加载,并且在该点也加载了帐户权限。该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 */ } 

回答

1

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

+0

那么我会将用户对象传递给项目对象吗? – 2009-08-05 15:23:28

+1

间接地,通过它的接口。在这个解决方案中,你将无法避开项目和用户知道这个接口的事实,但是项目不需要知道它是否正在与用户或TestHarness等进行交谈。 – DanDan 2009-08-05 15:28:57

1

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

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

然后在你的代码,你只需调用在业务层传递结果返回给表示层之前添加到checkProjectPermission。当然,这是一种相当程序化(即非OO)的方法,但很显然,所有基于权限的逻辑都属于同一类。基于异常的方法也意味着代码中的if-then语句更少。

+0

如果有多个加载项目的页面,并且在一个页面中用户应该被授权加载项目,但在另一个页面中,用户不应该被授权加载项目? – 2009-08-05 19:55:54