通过pl / sql函数检查oracle用户身份验证

时间:2013-01-16 05:20:38

标签: oracle authentication

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

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

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

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

3 个答案:

答案 0 :(得分:0)

我不会在第一时间这样做 我会使用其中的众多工具之一在Web应用程序中进行身份验证 更重要的是,我将创建连接池的db用户 - 代理用户,并且永远不会提供或检查应用程序中用户的数据库密码(如this asktom post中所述)。

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

从网络应用程序访问DBA_USERS视图中的密码听起来非常糟糕......

答案 1 :(得分:0)

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

您可以在plsql中创建一个动态创建DBLink给用户的功能 然后你将尝试(动态地再次)使用该dblink查询DUAL表,
如果它有效 - 返回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等等

我不建议使用此解决方案
(我为它的运动写了更多...)

答案 2 :(得分:0)

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

 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解析实用程序类。