0

Oracle を使用する Java Web アプリケーションを開発しています。Web アプリは Glassfish AS を使用し、構成された接続プールを介して Oracle に接続します。

ユーザー認証を実行するためのお客様の要件は、提供されたユーザー ログイン/パスワードで Oracle セッションの作成を試みることであり、それが成功すると、ユーザーは正常にログオンされます。

最初に頭に浮かんだアイデアは、ログイン/パスワードを取得し、ハッシュを実行し、ハッシュを保存されているものと比較する関数を作成することです。しかし、そうすると、ハッシュアルゴリズムがいつでも変更される可能性がある、オラクルアカウントがロックされる可能性があるため、追加のチェックを実行する必要があるなどの落とし穴があります。

Oracleへのセッションを作成する以外に、Oracleユーザー認証を確認するための信頼できる方法を教えてもらえますか?

4

3 に答える 3

0

そもそもやらないだろう。
そこに存在する多くのツールの1つを使用して、Webアプリケーションで認証を行います。
それ以上に、接続プールの db ユーザー (プロキシ ユーザー) を作成し、アプリケーション内のユーザーの DB パスワードを提供したり確認したりしません (この質問投稿で説明されているように)。

しかし、ユーザー認証を実行するための顧客の要件は、Oracle セッションを作成しようとすることなので、なぜそれをしないのでしょうか?

Web アプリケーションから表示されているパスワードにアクセスすることはDBA_USERS、非常に悪い考えのように思えます...

于 2013-01-16T13:24:29.587 に答える
0

私はあなたのために別の(非常に悪い)アイデアを持っています-

ユーザーへのDBLinkを動的に作成する関数をplsqlで作成できます。次に、その dblink を使用し
て (再び動的に) テーブルをクエリしようとします。それが機能する場合は、OK を返します。それ以外の 場合は、OK を返しません。 その後、dblink を (再び動的に) ドロップします。DUAL

この匿名ブロックのように見えるはずです-

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 の名前をユーザー/試行 (Web セッション) ごとに異なるものにする必要があり
ます。

また、これにより不要な dblinks がデータベースなどに残る可能性があることに注意してください。

このソリューションを使用することはお勧めしません
(私はそれのスポーツのためにそれをもっと書きました...)

于 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 に答える