Oracle apex身份验证方案登录错误

时间:2018-05-26 16:45:15

标签: oracle-apex sql-pl

FUNCTION authenticate(p_username IN VARCHAR2,p_password IN VARCHAR2) RETURN 
BOOLEAN 
is
l_count integer;
begin
select count(*)
into   l_count
from   STUDENT, ADMIN, ORGANISATION
WHERE upper(Student.STUDENT_ID, ADMIN.ADMIN_ID, ORGANISATION.ORG_ID) = 
upper(p_username)
AND upper(Student.STUDENT_PASSWORD, ADMIN.ADMIN_PASSWORD, 
ORGANISATION.ORG_PASSWORD) = upper(p_password);
return (l_count > 0);
end;

上面是我从多个表中获取信息并使用它们来验证登录的身份验证代码。如果我只是为学生这样做它工作正常,但我需要多种类型的用户才能访问该软件,我不能让多个身份验证方案同时运行 所有表名和列名都是正确的 以下是我得到的错误 ORA-06550:第9行,第7列:PL / SQL:ORA-00909:无效的参数个数ORA-06550:第6行,第1列:PL / SQL:忽略SQL语句

3 个答案:

答案 0 :(得分:6)

我想尝试分解它,然后解决问题。有很多事情要解决。

逻辑

你如何控制整个桌子的独特性?学生管理中可能都有ALBERT。它甚至可能是该设施的同一个人,学生和雇员。我是这样的人。

建议的SQL

您的表之间没有连接,这会将结果转换为cartesion产品,并且我非常确定您可以使用NIKOLA的密码返回ALBERT登录。

我认为您可能打算使用集合运算符

select ...
from student 
where ...
union all
select ...
from admin
where ...

UNION ALL 表示无需检查唯一性,也不需要extra sort

密码保护

能够UPPER密码意味着您将其保存为明文。今天的人们应该继承足够的数字流畅性,使密码不应该存储明文。如初。

有关如何通过散列密码在APEX中设置自定义身份验证的示例,请参阅此文章。在一个令人失望的数字中,这是一个罕见的数字,没有哈希密码。这个也用用户名和一些盐哈希,这是更好的。 http://barrybrierley.blogspot.com.au/2015/05/custom-authentication-in-apex.html

它也开始满足您对用户类型的需求。

我确定APEX文档中有一个示例,但我无法找到它。

用户类型 - 授权

确定您拥有有效用户后,您可以确定他们的用户类型,然后使用Authorization Schemes控制他们对各种组件的访问权限。

对于更灵活的系统,我会进一步抽象并使用授权方案来控制特权到某些组件,并将这些组件分配给业务角色授予用户

这为您的多种类型的人提供服务"。

'记录存在'检查

从早期开始,我在AskTom学习了一些关于检查行是否存在的东西,这似乎在所有版本中都能很好地存在

declare
  ln_exists pls_integer;
begin
  select count(*)
  into ln_exists
  from dual
  where exists (
     select null 
     from your_table -- whatever you're looking for
     where id = p_id
  );
  return ln_exists = 1; -- true if exists
 end;

Oracle知道如何花最少的精力来解决这个问题。

许多其他变体只是从数据库中选择了太多行。

共享应用程序

可以使用对同一应用程序的不同身份验证来实际定义多个入口点。 http://www.grassroots-oracle.com/2014/04/shared-authentication-across-multiple-apex-apps.html

答案 1 :(得分:0)

With valid_student as (
select count(*) as student_result 
from student 
where upper (p_username) = upper(student_id)
And upper(p_password) = upper(student_password)
),
valid_Admin as (
select count(*) as admin_result 
from admin
where upper (p_username) = upper(admin_id)
And upper(p_password) = upper(admin_password)
),
valid_org as (
select count(*) as org_result 
from organisation 
where upper (p_username) = upper(org_id)
And upper(p_password) = upper(org_password)
)
Select “Valid” as access_allowed
From valid_student s, valid_admin a, valid_org o
 Where s.student_result = 1 or a.admin_result = 1 or o.org_result = 1

答案 2 :(得分:-1)

语法错误。尝试

select count(*) 
into l_count
from student,
     admin,
     organisation
where upper(p_username) in (upper(student.student_id),
                            upper(admin.admin_id),
                            upper(organisation.org_id)
                           )
  and upper(p_password) in (upper(student.student_password),
                            upper(admin.admin_password),
                            upper(organisation.org_password)
                           );