我有一个容器类,除了servlet部分外,数据访问层是一个与我的数据库交互并为查询参数提供结果的层。
我将我的数据访问层类和方法公之于众,这样任何人都可以读取存储在数据库中的内容,相信只有合适的人才能访问它。
通常在验证完成后(即授权完成)发生对数据库的读/写。用户对数据的授权在我的容器层(比如servlet)中执行,之后我开始读/写数据到我的数据库。
听起来理论太多了吗?这是我的数据访问层的示例片段:
DataStore.java
//This is my interface
public interface DataStore {
public String[] selectData(query params) throws Exception;
public String[] addData(query params) throws Exception;
public String[] editData(query params) throws Exception;
public String[] deleteData(query params) throws Exception;
}
DataStoreImpl.java
//This is my implemetation part of my above interface
public class DataStoreImpl implements DataStore {
public String[] selectData(query params) throws Exception {
//Code implementing select query logic
}
public String[] addData(query params) throws Exception {
//Code implementing insert query logic
}
public String[] editData(query params) throws Exception {
//Code implementing update query logic
}
public String[] deleteData(query params) throws Exception {
//Code implementing delete query logic
}
}
现在我最糟糕的噩梦是,如果有人在未经授权的情况下在我的数据库中读/写数据,因为我的数据访问层中的所有类和方法都是“公共的”。我怎么能克服这个?
即,如何确保某人在授权后通过数据访问层访问我的类和方法?
我如何知道DataStore或DataStoreImpl中的类和方法的调用者?还是有其他选择吗?
答案 0 :(得分:1)
首先,这与数据访问层恕我直言无关。这看起来您希望自己实现代码访问安全性。我认为,你不应该担心"未经授权的用户呼叫DAL方法"因为这个责任在于BLL或应用程序代码。您可以培训您的同事如何使用您的代码。最终用户永远不会访问您的代码,他只会通过您的应用程序与其进行交互。因此,如果正确编写应用程序,则永远不会发生问题。
顺便说一下,如果你还需要它,我会想到以下几点: -
Authorazation
的构造函数中注入DataStoreImpl
对象并验证它。如果无效,请抛出适当的异常。使用标志变量的类似解决方案已由" El Marce"在评论中。internal
(这是C#。不确定它在Java中的等效内容)将为您添加保护方法。