Oracle apex Oracle APEX执行过程/功能
我想写一个自定义登录,为此我想使用一个过程/函数来创建和登录用户(散列密码) 我当前的数据库设置如下(来自此网站:): 我当前的PLSQL包定义如下所示:Oracle apex Oracle APEX执行过程/功能,oracle-apex,Oracle Apex,我想写一个自定义登录,为此我想使用一个过程/函数来创建和登录用户(散列密码) 我当前的数据库设置如下(来自此网站:): 我当前的PLSQL包定义如下所示: CREATE OR REPLACE PACKAGE app_user_security AS FUNCTION get_hash (p_username IN VARCHAR2, p_password IN VARCHAR2) RETURN VARCHAR2; PROCED
CREATE OR REPLACE PACKAGE app_user_security AS
FUNCTION get_hash (p_username IN VARCHAR2,
p_password IN VARCHAR2)
RETURN VARCHAR2;
PROCEDURE add_user (p_username IN VARCHAR2,
p_password IN VARCHAR2);
PROCEDURE change_password (p_username IN VARCHAR2,
p_old_password IN VARCHAR2,
p_new_password IN VARCHAR2);
PROCEDURE valid_user (p_username IN VARCHAR2,
p_password IN VARCHAR2);
FUNCTION valid_user (p_username IN VARCHAR2,
p_password IN VARCHAR2)
RETURN BOOLEAN;
END;
/
CREATE OR REPLACE PACKAGE BODY app_user_security AS
FUNCTION get_hash (p_username IN VARCHAR2,
p_password IN VARCHAR2)
RETURN VARCHAR2 AS
l_salt VARCHAR2(30) := 'PutYourSaltHere';
BEGIN
-- Pre Oracle 10g
RETURN DBMS_OBFUSCATION_TOOLKIT.MD5(
input_string => UPPER(p_username) || l_salt || UPPER(p_password));
-- Oracle 10g+ : Requires EXECUTE on DBMS_CRYPTO
--RETURN DBMS_CRYPTO.HASH(UTL_RAW.CAST_TO_RAW(UPPER(p_username) || l_salt || UPPER(p_password)),DBMS_CRYPTO.HASH_SH1);
END;
PROCEDURE add_user (p_username IN VARCHAR2,
p_password IN VARCHAR2) AS
BEGIN
INSERT INTO app_users (
id,
username,
password
)
VALUES (
app_users_seq.NEXTVAL,
UPPER(p_username),
get_hash(p_username, p_password)
);
COMMIT;
END;
PROCEDURE change_password (p_username IN VARCHAR2,
p_old_password IN VARCHAR2,
p_new_password IN VARCHAR2) AS
v_rowid ROWID;
BEGIN
SELECT rowid
INTO v_rowid
FROM app_users
WHERE username = UPPER(p_username)
AND password = get_hash(p_username, p_old_password)
FOR UPDATE;
UPDATE app_users
SET password = get_hash(p_username, p_new_password)
WHERE rowid = v_rowid;
COMMIT;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20000, 'Invalid username/password.');
END;
PROCEDURE valid_user (p_username IN VARCHAR2,
p_password IN VARCHAR2) AS
v_dummy VARCHAR2(1);
BEGIN
SELECT '1'
INTO v_dummy
FROM app_users
WHERE username = UPPER(p_username)
AND password = get_hash(p_username, p_password);
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20000, 'Invalid username/password.');
END;
FUNCTION valid_user (p_username IN VARCHAR2,
p_password IN VARCHAR2)
RETURN BOOLEAN AS
BEGIN
valid_user(p_username, p_password);
RETURN TRUE;
EXCEPTION
WHEN OTHERS THEN
RETURN FALSE;
END;
END;
/
包本身看起来是这样的:
CREATE OR REPLACE PACKAGE app_user_security AS
FUNCTION get_hash (p_username IN VARCHAR2,
p_password IN VARCHAR2)
RETURN VARCHAR2;
PROCEDURE add_user (p_username IN VARCHAR2,
p_password IN VARCHAR2);
PROCEDURE change_password (p_username IN VARCHAR2,
p_old_password IN VARCHAR2,
p_new_password IN VARCHAR2);
PROCEDURE valid_user (p_username IN VARCHAR2,
p_password IN VARCHAR2);
FUNCTION valid_user (p_username IN VARCHAR2,
p_password IN VARCHAR2)
RETURN BOOLEAN;
END;
/
CREATE OR REPLACE PACKAGE BODY app_user_security AS
FUNCTION get_hash (p_username IN VARCHAR2,
p_password IN VARCHAR2)
RETURN VARCHAR2 AS
l_salt VARCHAR2(30) := 'PutYourSaltHere';
BEGIN
-- Pre Oracle 10g
RETURN DBMS_OBFUSCATION_TOOLKIT.MD5(
input_string => UPPER(p_username) || l_salt || UPPER(p_password));
-- Oracle 10g+ : Requires EXECUTE on DBMS_CRYPTO
--RETURN DBMS_CRYPTO.HASH(UTL_RAW.CAST_TO_RAW(UPPER(p_username) || l_salt || UPPER(p_password)),DBMS_CRYPTO.HASH_SH1);
END;
PROCEDURE add_user (p_username IN VARCHAR2,
p_password IN VARCHAR2) AS
BEGIN
INSERT INTO app_users (
id,
username,
password
)
VALUES (
app_users_seq.NEXTVAL,
UPPER(p_username),
get_hash(p_username, p_password)
);
COMMIT;
END;
PROCEDURE change_password (p_username IN VARCHAR2,
p_old_password IN VARCHAR2,
p_new_password IN VARCHAR2) AS
v_rowid ROWID;
BEGIN
SELECT rowid
INTO v_rowid
FROM app_users
WHERE username = UPPER(p_username)
AND password = get_hash(p_username, p_old_password)
FOR UPDATE;
UPDATE app_users
SET password = get_hash(p_username, p_new_password)
WHERE rowid = v_rowid;
COMMIT;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20000, 'Invalid username/password.');
END;
PROCEDURE valid_user (p_username IN VARCHAR2,
p_password IN VARCHAR2) AS
v_dummy VARCHAR2(1);
BEGIN
SELECT '1'
INTO v_dummy
FROM app_users
WHERE username = UPPER(p_username)
AND password = get_hash(p_username, p_password);
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20000, 'Invalid username/password.');
END;
FUNCTION valid_user (p_username IN VARCHAR2,
p_password IN VARCHAR2)
RETURN BOOLEAN AS
BEGIN
valid_user(p_username, p_password);
RETURN TRUE;
EXCEPTION
WHEN OTHERS THEN
RETURN FALSE;
END;
END;
/
我可以在CMD中这样称呼它:
exec app_user_security.add_user('admin','admin');
但如果我想在APEX>sqlworkshop>SQL命令中创建一个用户,它只会告诉我
ORA-00900:无效的SQL语句
为什么会这样?我怎样才能解决这个问题?我想稍后在具有自定义登录方案的应用程序上使用此登录,因此如果其中有一些用户,那就太好了。请尝试在APEX>SQL Workshop>SQL命令下运行下面的代码
BEGIN
app_user_security.add_user('admin','admin');
END;
要了解有关sql workshop下sql命令的更多信息,请查看下面的链接
希望这对你有帮助 请尝试在APEX>SQL Workshop>SQL命令下运行以下代码
BEGIN
app_user_security.add_user('admin','admin');
END;
要了解有关sql workshop下sql命令的更多信息,请查看下面的链接
希望这对你有帮助 您使用的是MS SQL Server还是Oracle?不要给不涉及的产品贴标签。@jarlh oracle-它告诉我使用它xD idk我随机点击标签,因为谁会读它们?我们都读它们是为了找到(或避免)。如果发现多余的标记,请跳过所有标记…@jarlh更新了标记。对不起,现在第二次使用stackoverflow(作为问题创建者)要好得多!请记住,SQL Server的答案可能适用于Oracle,也可能不适用于Oracle。正确的标签将为您提供最优质的anwers-最快!(不要浪费其他用户的时间为未使用的产品编写答案。)您使用的是MS SQL Server还是Oracle?不要给不涉及的产品贴标签。@jarlh oracle-它告诉我使用它xD idk我随机点击标签,因为谁会读它们?我们都读它们是为了找到(或避免)。如果发现多余的标记,请跳过所有标记…@jarlh更新了标记。对不起,现在第二次使用stackoverflow(作为问题创建者)要好得多!请记住,SQL Server的答案可能适用于Oracle,也可能不适用于Oracle。正确的标签将为您提供最优质的anwers-最快!(不要浪费其他用户的时间为未使用的产品写答案。)