Chinaunix首页 | 论坛 | 博客
  • 博客访问: 831679
  • 博文数量: 137
  • 博客积分: 3477
  • 博客等级: 中校
  • 技术积分: 1409
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-30 21:53
文章分类

全部博文(137)

文章存档

2024年(8)

2023年(10)

2022年(4)

2021年(10)

2020年(9)

2018年(1)

2017年(1)

2014年(4)

2013年(3)

2012年(12)

2011年(24)

2010年(2)

2009年(8)

2008年(6)

2007年(34)

2006年(1)

分类: 数据库开发技术

2021-08-05 10:44:40

写在前面的话:在开发基于 PowerBuild 的 Client/Server 数据库系统的时候,我们使用得最多的是 ODBC 或者各数据库的专用连接方式,这些方式连接方式简洁,操作效率高,对于快速开发系统很有好处,然而这样的方式也有一个不容忽视的弊端。那就是数据库的连接参数必须写入到客户端的注册表中,而且是采用明码方式存放,这对于我们的系统带来了巨大的安全隐患,试想一下,如果我们的数据库服务器的地址、访问数据库的用户名和密码均暴露在客户端,那会是一种什么样的后果?如果我们最终发布的系统依然采用这样的方式,那系统的安全是完全没有保障的。

基于以上的原因,我们自然会需要想到一种解决办法,如果能将数据库地址、访问数据库的用户名、密码采取一种加密的方式存放,则系统的安全性就会大大提高。

然而遗憾的是,采用 ODBC或其他数据库的专有访问方式连接数据库,如果对存放于注册表中的数据库地址、访问数据库的用户名、,密码进行加密存放,结果是无法访问数据库。如果采用文件DSN来访问数据库呢?看起来是一个解决问题的思路,如果能采用文件 DSN 来访问数据库,则可以在读入 DSN 文件后,进行解密,然后交由 PowerBuild 程序管理数据库的连接,这似乎是一个不错的想法,可惜在实际测试中依然没有成功。

那么有没有其他的办法呢?近来 JAVA 程序很流行,很多数据库都提供了 JDBC 的方式访问数据库,经过反复测试,发现 JDBC 方式访问数据库,只需要将访问的参数传递给 PowerBuild 的数据库访问对象中定义的相关参数,就能够实现与数据库的连接与访问,而这些连接参数可以放置在一个配置文件中,通过一定的方式读取,如果我们能对这个配置文件进行加密,则既可以保证系统的安全性,又能提供一个很好的访问数据库的手段。

本文不探讨文件的加密部分,配置文件的加密请各位自己实现,本文仅探讨采用 JDBC 方式连接数据库。

以下内容以 PostgreSQL 数据库为例,PowerBuild 12.5.Net 版本上实现,其他数据库的连接方式大同小异,主要的区别在于 DriverName 和 URL 的参数不同,其他部分大体一致,请大家自己摸索。

系统环境说明:
  客户端:
      开发语言:PowerBuild 12.5.Net
      操作系统:Windows 10 企业版
      jdbc驱动:postgresql-42.2.23.jre6.jar
      IP 地址:192.168.137.1
  服务端:
      数 据 库:PostgreSQL 12.7
      操作系统:SCO OpenServer 6.0.0Ni
      IP 地址:192.168.137.103
      端 口 号:5432

环境准备:
  step 1:  开启 PostgreSQL 12.7 远程访问支持。
      a)修改 data/pg_hba.conf 文件:
      修改:
      host    all             all             127.0.0.1/32              trust
      为:
      host    all             all             127.0.0.1/32              md5

      在其下面加入如下内容:
      host    all             all               0.0.0.0/0               md5

     b)修改 data/postgresql.conf 文件:
     修改:
     # port = 5432
     为:
     port = 5432

     修改:
     # listen_addresses = 'localhost'
     为:
    listen_addresses = '*'

     修改:
    #password_encryption = md5
     为:
     password_encryption = md5

  step 2:  重启数据库并创建 testdb 数据库。
     $ pg_ctl -D $HOME/data stop
     $ pg_ctl -D $HOME/data start
     $ createdb -E UTF8 -U postgres testdb

PowerBuild 通过 jdbc 连接 postgresql 数据库的开发测试。
  step 1:  打开 PowerBuild 12.5.Net ,配置 jdbc 连接 postgresql 数据库 testdb 的连接。
      a) 打开 DB Profile , 在 JDC JDBC 上点击右键,新建一个 New Profile 。
        在弹出的配置框上输入如下信息:
        【connection】 tabpage 页上:
         Profile name : test
         Driver  name : org.postgresql.Driver
         URL       : jdbc:postgresql://192.168.137.103:5432/testdb
         Login   ID : postgres
         Possword    : postgres

        【System】 tabpage 页上:
         PowerBuild Catalog Table Owner :public , 或者您有别的 schema ,您可以输入新的 schema 名称。

       【Preview】 tabpage 页上:
         点击 Test Connection 看看,是不是连上了。^_^.

       我们点击“OK”按钮,保存刚刚的配置信息。

  step 2:新建一个 WorkSpace , 名字为 test 。
  step 3:在新建的 WorkSpace test 下面,新建一个应用,名称为 test 。
  step 4:在新建的 test 应用目录下,新建一个 test.ini 文件,内容如下:

点击(此处)折叠或打开

  1. [DataBase]
  2. DBMS = JDBC
  3. DataBase = testdb
  4. LogID = postgres
  5. LogPass = postgres
  6. DBParm = "Driver='org.postgresql.Driver',URL='jdbc:postgresql://192.168.137.103:5432/testdb'"
  7. AutoCommit = 0
  step 5:打开新建的 test 应用,在其中的 open 事件中,添加如下代码:

点击(此处)折叠或打开

  1. String ls_profiles = "test.ini"
  2. SQLCA.DBMS = ProFileString ( ls_profiles,"DataBase","DBMS","");
  3. SQLCA.LogPass = ProFileString ( ls_profiles,"DataBase","LogPass","");
  4. SQLCA.LogId = ProFileString ( ls_profiles,"DataBase","LogID","");
  5. SQLCA.DBParm = ProFileString ( ls_profiles,"DataBase","DBParm","");
  6. SQLCA.AutoCommit = False
  7. Connect Using SQLCA;
  8. IF SQLCA.SQLCODE <> 0 Then
  9.     MessageBox("","Connect Error");
  10.     Return
  11. Else
  12.     MessageBox("","Connect OK");
  13. End if

特别注意事项:
  在实际的配置过程中,发现 PowerBuild 12.5.Net 使用的是 jdk 1.6 , 因此我们的 PostgreSQL JDBC 驱动包也只能使用jdk 1.6 的支持包,截止于本文发布时间为止,最新的 jdk 1.6 的 jdbc 驱动包为 postgresql-42.2.23.jre6.jar ,如果使用其他的驱动包,会出现 Java Exception : Fatal Error. Unable to initialize DatabaseMetaData class 错误。切记,切记。

阅读(2233) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~