我有一个需要访问远程数据库的 Java 客户端。目标是向用户隐藏数据库凭据,而不是在代码中硬编码任何凭据。因此,数据库访问可能必须在服务器端。
我仅限于使用 Ibatis 作为数据抽象框架。除此之外,我还在网络服务器上运行 JBoss,允许我使用数据源。
您将如何设计远程数据库访问和数据序列化/反序列化。您是否更喜欢某种数据流的 Web 服务而不是套接字?你将如何实现两者中的任何一个?
我有一个需要访问远程数据库的 Java 客户端。目标是向用户隐藏数据库凭据,而不是在代码中硬编码任何凭据。因此,数据库访问可能必须在服务器端。
我仅限于使用 Ibatis 作为数据抽象框架。除此之外,我还在网络服务器上运行 JBoss,允许我使用数据源。
您将如何设计远程数据库访问和数据序列化/反序列化。您是否更喜欢某种数据流的 Web 服务而不是套接字?你将如何实现两者中的任何一个?
构建一个服务层并在 RMI 上公开它 - 可能作为您拥有 JBoss 的 EJB3 无状态会话 bean,可能作为纯 RMI。除非您有特殊需要,否则我不会使用 Web 服务。RMI 将为您处理序列化的情况。
您的服务层需要公开一种方法来使用在 Swing 应用程序启动时输入的凭据对用户进行身份验证。所有对数据的调用都经过服务层。Swing 应用程序中不存在 SQL。
除了隐藏数据库凭据之外,这种安排还有其他好处。您不仅最终获得了分层架构,而且通过在服务器上拥有单个数据源,您可以通过在所有客户端之间共享准备好的语句来提高效率。
因此,您希望用户能够在不知道凭据的情况下访问数据库吗?您唯一的选择是服务器端数据库访问。不幸的是,没有办法在 Java 中隐藏用户名和密码——如果你把它放到一个属性文件中并加密它,一个确定的攻击者仍然可以附加一个调试器并查看你的代码中保存了哪些值。
此外,除非您通过安全连接连接到数据库,否则有人可以运行数据包嗅探器(例如 tcpdump)并在那里获取凭据。
您说您正在运行 JBoss 服务器,最好的办法是设置远程 EJB,这样您的客户端应用程序就不会直接访问数据库——它必须通过您的 EJB 方法。(它不一定是 EJB,顺便说一下,如果你愿意,你可以做一些诸如 web 服务之类的事情)。
关键是,您的服务器直接与数据库通信,而您的客户端的唯一访问权限是通过您在服务器上定义的一组有限的接口。
如前所述,您必须连接到处理数据库连接的服务器。没有办法有效地防止有人破坏您的安全,只需 30 分钟的努力。
如果客户端在本地连接,在 Intranet 中,在您的应用服务器上使用 EJB 可能是最好的选择......虽然您可能想要无状态会话 bean,但我不一定会打折消息驱动的 bean。
对于来自外部的更远距离的流量,我会通过 HTTPS 使用 Web 服务
在任何情况下,大多数应用服务器都有将 EJB 公开为 Web 服务的机制,使用 WSDL。并且有大约一百个实用程序可以从 WSDL 生成客户端、调用 web 服务(axis 的 wsdl2java 工作得很好)