我有一个数据访问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将用于访问数据层。是否有更好的方法将授权/身份验证与数据访问层绑定在一起?
答案 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;
...
}
显然,您必须创建其他代码才能进行真正的检查。