【问题标题】:Is this a good design for checking user access permissions to a data layer?这是检查用户对数据层的访问权限的好设计吗?
【发布时间】:2011-01-05 02:54:00
【问题描述】:

我有一个数据访问 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 将用于访问数据层。有没有更好的方法将授权/身份验证与数据访问层联系起来?

【问题讨论】:

    标签: java authorization data-access-layer


    【解决方案1】:

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

    例子:

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

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

    【讨论】:

      【解决方案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);
      

      【讨论】:

        猜你喜欢
        • 2014-08-13
        • 2015-01-11
        • 2011-08-07
        • 2013-01-26
        • 1970-01-01
        • 1970-01-01
        • 2013-05-17
        • 1970-01-01
        • 2016-03-03
        相关资源
        最近更新 更多