【开发问题&解决方法记录】05.dian 多角色切换&基地隔离
校验输入的只能是字母数字,js
if (!/^[a-zA-Z0-9]*$/.test($v('P31_ROLE_ID'))) {
alert("只支持输入20位英文和数字的内容,请重新输入");
$s('P31_ROLE_ID', ''); // 清空输入框的内容
return false;
}
登录页想加入基地的选择,即用户输入工号,通过工号获取该用户所属基地,若是该用户由多个基地,则以选择列表/单选项的形式让其选择一个基地登录,其他基地的状态就改为禁用,以此达到数据隔离的效果。
问题1?
在数据库查询是正常的,页面展示选择基地受阻
项P9999_BASE_DEPT_ID的sql查询语句
/**
* create by: xiaoxiao
* create date:2023/12/9 14:54
* modify by:
* modify date:
* describe:查找该用户对应基地名 区分基地
*/
select ORIGINAL_DEPT_ID,ORIGINAL_DEPT_NAME
from DIAN_BASIC_DEPT_HIERARCHICAL_V
where ORIGINAL_DEPT_ID in (select BASE_DEPT_ID
from APEX_TENANT_USERS
where DEL_FLAG = 0
AND JA_UTILS_PKG.DECRYPT_DEC(PASSWORD) = :P9998_PASSWORD --将数据库中存储的密码解密后与用户输入密码比较
and JOB_NUMBER = upper(:P9998_USERNAME)
);
select ORIGINAL_DEPT_ID,ORIGINAL_DEPT_NAME
from DIAN_BASIC_DEPT_HIERARCHICAL_V
where ORIGINAL_DEPT_ID in (select BASE_DEPT_ID
from APEX_TENANT_USERS
where DEL_FLAG = 0
AND PASSWORD = JA_UTILS_PKG.ENCRYPT_ENC(:P9998_PASSWORD) --将用户输入密码加密后与数据库中存储的密码比较
and JOB_NUMBER = upper(:P9998_USERNAME)
);
后来解决了,类型的sql查询,但是内置老是变成pl/sql语句
但是注销后想要登录会报错,显示
【问题2】抱歉, 此页不可用
找不到应用程序 "304" 页 "LOGIN"。
请与您的应用程序管理员联系。
【问题原因】未将用户登录界面设置别名,找不到页
http://xxx.xxx.xxx.xxx:8080/ords/f?p=304:LOGIN:13713205941117:::::
【问题解决】
,在登录页P9999将别名设置为Login即可
想往其中添加一个多基地的用户,但是受限于约束条件,无法添加
后续改进逻辑
如图所示,切换账号密码登录出错
检测到内联错误,但兼容模式不是21.2,继续处理
啊这……
原来是该用户一人多用户ID,该用户ID不在账户表中,怪不得。
【新增账号失败】,也没报错来着,后来查了日志
select * from JA_LOG.JA_SYSTEM_LOGS where USER_ID = '445429168750405';
发现还是账户表的唯一约束条件限制
ORA-00001: 违反唯一约束条件 (JING_DIAN.APEX_TENANT_USERS_PK) ORA-06512: 在 line 23
【未分配角色给用户,无法获取到对应信息,初始化日志会报错】
服务器错误ORA-01400: 无法将 NULL 插入 ("JING_DIAN"."DIAN_LOGS"."TENANT_ID")
【解决方法】
当用户登录但未分配角色时,若ROLE_ID为NULL则给一个默认值
BEGIN? VISTED_LOG(:APP_ID,:APP_NAME,NVL(:USER_ID,0),:APP_PAGE_ID,:APP_PAGE_ALIAS,NVL(:USER_NAME,'游客'),NVL(:USER_TENANT,3));
END;
BEGIN
VISTED_LOG(:APP_ID,:APP_NAME,NVL(:USER_ID,0),:APP_PAGE_ID,:APP_PAGE_ALIAS,NVL(:USER_NAME,'游客'),NVL(:USER_TENANT,3));
END;
【小细节】
目前无论有无角色都可以看到“我要反馈”和“角色切换”
想要让没有分配角色的用户无法看到反馈和角色切换栏,
解决方法
在【列表】-【列表条目】-【我要反馈】-【条件】新增条件,
条件类型“返回布尔值的函数体”
begin
if :USER_ID is NULL then
return false;
else
return true;
end if;
end;
若是用户未被分配角色则无法展示任何页面,也不会展示“我要反馈”和“切换角色”
晶捷免登:
无法实现晶捷免登,难道是注释的原因?
会犯的错:开发环境改好了函数没同步到生产环境,会出现角色删除但是还能使用权限
函数同步即可
【明明是用户表中的用户到那时无法登录,提示“工号不存在”/'非管理员不能登录,请联系管理员'】
【问题原因】
数据库中用户并非单租户,造成租户号和基地号不统一,租户为1但是基地为3,
【解决方案】
删除无效数据(一个用户同一时间只有一条租户信息生效)
角色判断备份:
create PROCEDURE LOGIN_SUCCESS_USER_SAVE_PRO AS
v_user_id number(20);
-- v_basic_login_user_id number(20); --晶点登录用户ID
v_tenant_id varchar2(10);
-- v_tenant_name varchar2(64);
v_name varchar2(64);
v_job_number varchar2(64);
v_mobile varchar2(64);
app_key VARCHAR2(100);
app_secret VARCHAR2(100);
v_dept_id VARCHAR2(100); --部门
v_base_dept_id VARCHAR2(64);--用户所属基地
v_err_msg VARCHAR2(2000);
v_role_id number(20); --晶点角色ID
v_role_level number(20); -- 晶点角色级别
v_role_row_count number(20); --角色数量
v_role_name VARCHAR2(100);--晶点角色名
-- v_is_sync_user number(20); -- 晶点角色 是否同步为晶系列用户,1同步,0未同步
v_original_dept_id VARCHAR2(200);--晶点原始组织架构ID ?
v_parent_original_dept_id VARCHAR2(200);--晶点原始组织架构父级ID ?
-- -- V_PARENT_DEPT_ID number(30); -- 虚拟组织 上级ID
-- V_IS_OTHERS_LOGIN_USER_ID NUMBER(20) := 0; -- 晶系列角色用户ID是否存在
-- V_OTHERS_LOGIN_USER_ID NUMBER(20) := 0; -- 晶系列角色用户ID
/**
* create by: xiaoxian
* create date:2023/11/28 17:26
* modify by:xiaoxian LOGIN_SUCCESS_USER_SAVE_WXX2
* modify date:2023/12/07 15:08 加了角色role_id 和 基地base_dept_id
* modify2 by:wxx
* modify date2:2023/12/11 13:15 规范化改造,统一命名
* describe:晶点登陆验证后过程3
*/
begin
-- 用户基本信息
select EXT_USER_ID,
NAME,
JOB_NUMBER,
MOBILE,
TENANT_ID,
BASE_DEPT_ID
into
v_user_id,v_name,v_job_number,v_mobile,v_tenant_id,v_base_dept_id
from APEX_TENANT_USERS
where IS_LEAVE = 0
and DEL_FLAG = 0
and JOB_NUMBER = upper(V('P9999_USERNAME'))
and TENANT_ID = V('P9999_USER_TENANT')
AND ROWNUM = 1;
-- 用户组织
SELECT ORIGINAL_DEPT_ID
INTO V_DEPT_ID
FROM DIAN_BASIC_DEPT_HIERARCHICAL_USER_V
WHERE TENANT_ID = v_tenant_id
AND USER_ID = v_user_id
AND ROWNUM = 1;
select APP_KEY, APP_SECRET
into app_key,app_secret
from DIAN_TENANT_APP
where TENANT_ID = v_tenant_id
and DEL_FLAG = 0
and name = 'JING_DIAN'
and ROWNUM = 1;
-- -- 晶系列角色登录用户ID
-- SELECT COUNT( 1 )
-- INTO V_IS_OTHERS_LOGIN_USER_ID
-- FROM DIAN_SYSTEM_LOGIN_USER
-- WHERE JOB_NUMBER = (SELECT JOB_NUMBER
-- FROM DIAN_SYSTEM_LOGIN_USER
-- WHERE SYSTEM_TYPE = 'DIAN'
-- AND DEL_FLAG = 0
-- AND TENANT_ID = apex_util.get_session_state( 'USER_TENANT' ))
-- AND SYSTEM_TYPE = 'OTHERS'
-- AND DEL_FLAG = 0
-- AND TENANT_ID = apex_util.get_session_state( 'USER_TENANT' );
--
-- -- 存在的情况下
-- IF V_IS_OTHERS_LOGIN_USER_ID > 0 THEN
-- SELECT LOGIN_USER_ID
-- INTO V_OTHERS_LOGIN_USER_ID
-- FROM DIAN_SYSTEM_LOGIN_USER
-- WHERE JOB_NUMBER = (SELECT JOB_NUMBER
-- FROM JING_DIAN.APEX_TENANT_USERS
-- WHERE SYSTEM_TYPE = 'DIAN'
-- AND DEL_FLAG = 0
-- AND TENANT_ID = apex_util.get_session_state( 'USER_TENANT' ))
-- AND SYSTEM_TYPE = 'OTHERS'
-- AND DEL_FLAG = 0
-- AND TENANT_ID = apex_util.get_session_state( 'USER_TENANT' );
-- END IF;
-- -- 获取租户名称
-- select NAME
-- into v_tenant_name
-- from MPF.TENANT
-- where TENANT_ID = v_tenant_id
-- and DEL_FLAG = 0
-- and ROWNUM = 1;
-- 查询用户是否分配角色
select count(U.ROLE_ID)
into v_role_row_count
from DIAN_SYSTEM_USER_ROLE u
inner join DIAN_SYSTEM_ROLE role
on u.ROLE_ID = role.ROLE_ID and role.TENANT_ID = u.TENANT_ID and
role.DEL_FLAG = 0 and role.IS_ENABLE = 1 and role.BASE_DEPT_ID = u.BASE_DEPT_ID
where U.DEL_FLAG = 0
and u.IS_ENABLE = 1 --账户“启用”的状态下
and u.TENANT_ID = v_tenant_id
and U.USER_ID = v_user_id
and U.BASE_DEPT_ID = v_base_dept_id;
-- 判断是否分配角色
if v_role_row_count > 0 then --该用户分配有角色
-- 获取当前角色ID和角色等级、角色名称
select ROLE_ID, ROLE_LEVEL,ROLE_NAME
into v_role_id,v_role_level,v_role_name
from (select role.ROLE_ID, role.ROLE_LEVEL,role.ROLE_NAME
from DIAN_SYSTEM_USER_ROLE u
inner join DIAN_SYSTEM_ROLE role
on u.ROLE_ID = role.ROLE_ID and role.TENANT_ID = u.TENANT_ID and
role.DEL_FLAG = 0 and role.IS_ENABLE = 1 and role.BASE_DEPT_ID = u.BASE_DEPT_ID
where role.SYSTEM_TYPE = 'DIAN'
and u.IS_ENABLE = 1 --账户“启用”的状态下
and u.DEL_FLAG = 0
and u.TENANT_ID = v_tenant_id
and U.USER_ID = v_user_id
and u.BASE_DEPT_ID = v_base_dept_id
order by role.ROLE_LEVEL desc) --按角色级别进行升序排列
where rownum = 1;
else --未分配角色给用户
end if;
SELECT BASE_DEPT_ID --存储所属基地ID
INTO v_base_dept_id
FROM DIAN_USER_ACCOUNT
WHERE TENANT_ID= v_tenant_id
AND USER_ID = v_user_id
AND DEL_FLAG = 0
AND IS_ENABLE = 1
AND ROWNUM = 1;
-- -- 获取当前角色所在的数据权限
-- select max( ORIGINAL_DEPT_ID ), max( PARENT_ORIGINAL_DEPT_ID )
-- into v_original_dept_id,v_parent_original_dept_id
-- from (select A.ORIGINAL_DEPT_ID, A.PARENT_ORIGINAL_DEPT_ID
-- from DIAN_SYSTEM_USER_ORIGINAL A
-- where A.ROLE_ID = v_role_id
-- -- and SYSTEM_ID is null
-- and A.TENANT_ID = v_tenant_id
-- order by PARENT_ORIGINAL_DEPT_ID)
-- where rownum = 1;
-- 虚拟组织 上级ID
-- SELECT LISTAGG( DEPT_ID , ',' )
-- INTO V_PARENT_DEPT_ID
-- FROM DIAN_BASIC_USER_DEPT_V
-- WHERE (PARENT_DEPT_ID IS NULL or PARENT_DEPT_ID = 1)
-- AND DEL_FLAG = 0
-- AND TENANT_ID = v_tenant_id;
-- IF V_PARENT_DEPT_ID IS NULL THEN
-- V_PARENT_DEPT_ID := 1;
-- END IF;
apex_custom_auth.set_user( v_name );
apex_util.set_session_state( 'USER_ID' , v_user_id );
-- apex_util.set_session_state( 'BASIC_LOGIN_USER_ID' , v_basic_login_user_id );
-- apex_util.set_session_state( 'OTHERS_LOGIN_USER_ID' , V_OTHERS_LOGIN_USER_ID );
apex_util.set_session_state( 'USER_TENANT' , v_tenant_id );
-- apex_util.set_session_state( 'USER_TENANT_NAME' , v_tenant_name );
apex_util.set_session_state( 'USER_NAME' , v_name );
apex_util.set_session_state( 'USER_JOB_NUMBER' , v_job_number );
apex_util.set_session_state( 'USER_MOBILE' , v_mobile );
apex_util.set_session_state( 'APP_KEY' , app_key );
apex_util.set_session_state( 'APP_SECRET' , app_secret );
apex_util.set_session_state( 'API_URL' , 'http://172.30.64.16:2010' );
apex_util.set_session_state( 'ROLE_ID' , v_role_id );
apex_util.set_session_state( 'ROLE_LEVEL' , v_role_level );
apex_util.set_session_state( 'ROLE_NAME' , v_role_name );
apex_util.set_session_state('BASE_DEPT_ID', v_base_dept_id);--存储登录用户所属基地ID
apex_util.set_session_state( 'APP_ENV' ,'DEV'); --环境标识
-- apex_util.set_session_state( 'BASIC_ROLE_IS_SYNC_USER' , v_is_sync_user );
-- apex_util.set_session_state( 'USER_ORIGINAL_DEPT_ID' , v_original_dept_id );
-- apex_util.set_session_state( 'USER_PARENT_ORIGINAL_DEPT_ID' , v_parent_original_dept_id );
-- apex_util.set_session_state( 'BASIC_PARENT_DEPT_ID' , V_PARENT_DEPT_ID );
exception
when others then
v_err_msg := sqlerrm || chr( 13 ) || dbms_utility.format_error_backtrace;
JA_WRITE_LOG( JA_UTILS_PKG.GET_FN_NAME( ) , 'error' , v_err_msg , apex_util.get_session_state( 'USER_ID' ) ,
apex_util.get_session_state( 'USER_TENANT' ) , V( 'APP_NAME' ) || ':' || V( 'APP_ID' ) );
end ;
/
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!