这是检查用户对数据层的访问权限的好设计吗?

时间:2010-01-14 15:09:26

标签: java authorization data-access-layer

我有一个数据访问API,看起来像:

public interface IDataAccess {
   void save(Doc doc);
   Doc retrieve(DocId id);
   void delete(Doc doc);
}

我需要根据用户的权限限制用户可以对文档执行的操作。我必须这样做的想法是创建另一个镜像数据访问操作的API,但在执行操作之前还要使用用户凭据来验证它们:

public interface IAuthDataAccess {

   // User is a previously authenticated user
   void save(Doc doc, User user) throws SecurityException;
   ...
}

public class AuthDataAccess implements IAuthDataAccess {
   IAuth auth = ...
   IDataAccess dataAccess = ...

   public void save(Doc doc, User user) throws SecurityException {
      if (auth.saveAllowed(doc, user)) {
         dataAccess.save(doc);
      } else {
         throw new SecurityException("access denied");
      }
   }
   ...
}

IAuthDataAccess API将用于访问数据层。是否有更好的方法将授权/身份验证与数据访问层绑定在一起?

2 个答案:

答案 0 :(得分:2)

你的方法使界面毫无意义,因为你实际上并没有实现这些方法 - 所有这一切都让人感到困惑。如果授权访问者实际实现了接口呢?例如像 -

public class AuthorizedDataAccessor implements IAuthDataAccess { 

 public AuthorizedDataAccessor(User user){ .. }

  void save(Doc doc) { ... save if authorized ...}
}

所以你可以写

IAuthDataAccess a=new AuthorizedDataAccessor(user);
 a.save(doc);

答案 1 :(得分:1)

更好的设计是在代码中加入方面编程。这可以通过使用Annotation来实现。

示例:

public interface IAuthDataAccess {

   @Restricted
   void save(Doc doc, User user) throws SecurityException;
   ...
}

显然,您必须创建其他代码才能进行真正的检查。