2

私の素朴さを許してください。しかし、私はこの問題と数時間戦っていますが、何の進歩もありません。私は Oracle にまったく慣れていませんが、まだ多くのカスタム機能に慣れています。

アプリケーションのカスタム認証方式を使用したログイン資格情報の検証に関する関数を (APEX インターフェイスのガイドラインに従って) 記述しようとしています。

ガイドラインには次のように記載されています。

ログインページで入力されたユーザーのユーザー名とパスワードを検証する関数の名前を指定します。何も入力しない場合は、任意のユーザー名/パスワードが成功することを許可します。関数自体は、パッケージ内またはストアド関数として、認証の「PL/SQLコード」テキスト領域で定義できます。この関数は、それを呼び出すログイン プロシージャにブール値を返す必要があります。エンド ユーザーがログイン ページに入力した値にアクセスするために使用できる 2 つの入力パラメーター「p_username」と「p_password」があります。例 「PL/SQL コード」テキストエリアに次のコードを入力します。

function my_authentication (
    p_username in varchar2,
    p_password in varchar2 )
    return boolean
is
    l_user my_users.user_name%type := upper(p_username);
    l_pwd  my_users.password%type;
    l_id   my_users.id%type;
begin
    select id  , password
      into l_id, l_pwd
      from my_users
     where user_name = l_user;

    return l_pwd = rawtohex(sys.dbms_crypto.hash (
                       sys.utl_raw.cast_to_raw(p_password||l_id||l_user),
                       sys.dbms_crypto.hash_sh512 ));
exception
    when NO_DATA_FOUND then return false;
end;

my_authenticationとしてAuthentication Function。_

私が書いた関数は、現在 pwd などを暗号化していないので複雑ではありません。

function my_authentication (p_username in varchar2,p_password in varchar2 )
    return boolean
is
    valid NUMBER;
    returnvalid BOOLEAN;
begin
    begin
        select 1
        into valid
        from users u
        where u.sys_user.login = lower(p_username) AND u.sys_user.password = p_password;    
    exception
        when NO_DATA_FOUND then valid := 0;
    end;
    returnvalid := valid=1;
    RETURN returnvalid;
end;

users テーブルは 3 つのフィールドで構成されていることを明確にするために、検証したいデータを格納するのは( 、、、 、のsys_user5 つのフィールドを持つオブジェクト タイプです)。idfnamelnameloginpassword

認証関数名を に設定しmy_authenticationてログインしようとすると、次のエラーが表示されます。

ORA-06550: line 1, column 7: PLS-00221: 'MY_AUTHENTICATION' is not a procedure or is undefined 
ORA-06550: line 1, column 7: PL/SQL: Statement ignored

これは私が変わったところから来ていると思います

apex_authentication.login(    
    p_username => :P101_USERNAME,
    p_password => :P101_PASSWORD
);

my_authentication(
    p_username => :P101_USERNAME,
    p_password => :P101_PASSWORD
);

Apex インターフェイスのProcessing-> Process-> Login->の下。Source私も解決策を見つけることができないように見えるのは、カスタム認証スキーム構成ページが、私が作成したブール値を返す関数を明確に要求しているときに、プロシージャを要求している理由です。ログイン手順がそれを呼び出すと述べていることは知っていますが、これは検証手順を開始するAPEXインターフェースであり、そこで私のメソッドを探しますか?

どんな助けでも大歓迎です。問題を理解するのに十分な詳細があることを願っています

どうもありがとう

4

1 に答える 1

2

ページ プロセス コードを変更するべきではありません。そのままにしておく必要があります。

apex_authentication.login(    
    p_username => :P101_USERNAME,
    p_password => :P101_PASSWORD
);

これにより、認証スキームで指定した認証機能を動的に実行することを含むいくつかのロジックが実行されます。

于 2015-04-07T17:32:41.297 に答える