0

我正在开发一个使用 Oracle 的 Java Web 应用程序。Web 应用程序使用 Glassfish AS 并通过配置的连接池连接到 Oracle。

客户执行用户认证的要求是尝试在提供的用户登录名/密码下创建oracle会话,如果成功,则用户成功登录。

我想到的第一个想法是编写一个函数,该函数接受登录名/密码,执行散列并将散列与存储的散列进行比较。但我担心,如果我这样做,我会遇到一些陷阱,比如哈希算法可以随时更改,oracle 帐户可能会被锁定,所以我必须执行额外的检查等等。

除了创建与 Oracle 的会话之外,任何人都可以建议我检查 oracle 用户身份验证的可靠方法吗?

4

3 回答 3

0

一开始我不会这样做。
我会使用现有的众多工具之一在 Web 应用程序中进行身份验证。
更重要的是,我将连接池的 db 用户设置为代理用户,并且从不提供或检查应用程序中用户的 DB 密码(如本 asktom 帖子中所述)。

但是既然执行用户身份验证的客户要求是尝试创建 oracle session,那么为什么不这样做呢?

从 Web 应用程序中访问密码DBA_USERS听起来是个非常糟糕的主意......

于 2013-01-16T13:24:29.587 回答
0

我有另一个(非常糟糕的)想法给你-

您可以在 plsql 中创建一个为用户动态创建 DBLink 的函数。
然后,您将尝试(再次动态地)DUAL使用该 dblink 查询表,
如果它有效 - 返回 ok 否则返回 not ok。
然后删除(再次动态)dblink。

应该看起来像这个匿名块-

DECLARE
  res NUMBER := 1;
BEGIN
  EXECUTE IMMEDIATE 'create database link temp_dblink connect to user identified by password using ''dbname''';

  BEGIN
    EXECUTE IMMEDIATE 'select 1 from dual@temp_dblink';

  EXCEPTION
    WHEN others THEN
      res := 0;
  END;

  ROLLBACK;
  dbms_session.close_database_link('temp_dblink');

  EXECUTE IMMEDIATE 'drop database link temp_dblink';
END;

这当然不能“原样”,
你需要绑定“用户名”和“密码”,
需要为每个用户/尝试(网络会话)设置不同的 tmp_dblink 名称,
等等......

另请注意,这可能会在您的数据库中留下不需要的 dblink 等等

我不推荐使用这个解决方案
(我写它更多是为了它的运动......)

于 2013-01-16T16:34:02.287 回答
0

我通过$GLASSFISH_ROOT/domains/domain1/domain.xml使用以下代码解析 glassfish 域配置文件解决了这个问题:

 private String getGlassfishConfigParameterJdbcUrl() {
    String instanceRoot = System.getProperty("com.sun.aas.instanceRootURI");
    URI configUri = null;
    try {
        configUri = new URI(instanceRoot);

        File configFile = new File(configUri.getPath(), "config" + File.separator + "domain.xml");
        XmlNode node = XmlNode.fromFile(configFile);
        return node.getNode("domain/resources/jdbc-connection-pool[@name=\"GLASSFISH_DB_POOL_NAME\"]/property[@name=\"URL\"]").getAttribute("value");
    } catch (URISyntaxException e) {
        throw new RuntimeException(e);
    }
}

XmlNode 是我用于 xml 解析的实用程序类。

于 2013-01-16T18:06:29.300 回答