首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle顶点身份验证方案登录错误

Oracle顶点身份验证方案登录错误
EN

Stack Overflow用户
提问于 2018-05-26 16:45:15
回答 3查看 988关注 0票数 2
代码语言:javascript
复制
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:无效参数数或-06550:行6,列1: PL/SQL: SQL语句被忽略。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-05-26 21:25:02

语法错误。试一试

代码语言:javascript
复制
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)
                           );
票数 -1
EN

Stack Overflow用户

发布于 2018-05-28 14:24:45

我想试着打破这个问题,解决这个问题。有许多事情要解决。

逻辑

您将如何控制跨表的唯一性?学生和行政部门都可能有阿尔伯特。它甚至可能是同一个人,一个学生和雇员的设施。我一直都是这样的人。

建议的SQL

您的表之间没有连接,这将将结果转化为一个cartesion产品,而且我确信您可以使用NIKOLA的密码返回true to ALBERT登录。

我想你可能是想用一个集合操作符

代码语言:javascript
复制
select ...
from student 
where ...
union all
select ...
from admin
where ...

统一意味着没有必要检查唯一性,也不需要额外排序

密码保护

要能够高于密码,就意味着您要存储它的明文。今天的人们应该继承足够的数字流畅性,以至于密码不应该存储明文。永远不会。

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

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

我确信在APEX文档中有一个例子,但是我找不到它。

用户类型-授权

一旦建立了有效的用户,就可以确定他们是哪种类型的用户,然后使用授权方案控制他们对各种组件的访问。

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

这为你的“多种类型的人”服务。

“记录存在”检查

从早期开始,我就在AskTom学到了一些关于检查行是否存在的知识,这似乎在所有版本中都能很好地支持。

代码语言:javascript
复制
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

票数 6
EN

Stack Overflow用户

发布于 2018-05-28 14:31:02

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50544986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档