【开发问题解决方法记录】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_IDfrom APEX_TENANT_USERSwhere DEL_FLAG = 0AND 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_IDfrom APEX_TENANT_USERSwhere DEL_FLAG = 0AND 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;

BEGINVISTED_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 ASv_user_id                 number(20);
--     v_basic_login_user_id     number(20); --晶点登录用户IDv_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); --晶点角色IDv_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_IDintov_user_id,v_name,v_job_number,v_mobile,v_tenant_id,v_base_dept_idfrom APEX_TENANT_USERSwhere IS_LEAVE = 0and DEL_FLAG = 0and JOB_NUMBER = upper(V('P9999_USERNAME'))and TENANT_ID = V('P9999_USER_TENANT')AND ROWNUM = 1;--     用户组织SELECT ORIGINAL_DEPT_IDINTO V_DEPT_IDFROM DIAN_BASIC_DEPT_HIERARCHICAL_USER_VWHERE TENANT_ID = v_tenant_idAND USER_ID = v_user_idAND ROWNUM = 1;select APP_KEY, APP_SECRETinto app_key,app_secretfrom DIAN_TENANT_APPwhere TENANT_ID = v_tenant_idand DEL_FLAG = 0and 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_countfrom DIAN_SYSTEM_USER_ROLE uinner join DIAN_SYSTEM_ROLE roleon u.ROLE_ID = role.ROLE_ID and role.TENANT_ID = u.TENANT_ID androle.DEL_FLAG = 0 and role.IS_ENABLE = 1 and role.BASE_DEPT_ID = u.BASE_DEPT_IDwhere U.DEL_FLAG = 0and u.IS_ENABLE = 1 --账户“启用”的状态下and u.TENANT_ID = v_tenant_idand U.USER_ID = v_user_idand U.BASE_DEPT_ID = v_base_dept_id;--    判断是否分配角色if v_role_row_count > 0 then  --该用户分配有角色-- 获取当前角色ID和角色等级、角色名称select ROLE_ID, ROLE_LEVEL,ROLE_NAMEinto v_role_id,v_role_level,v_role_namefrom (select role.ROLE_ID, role.ROLE_LEVEL,role.ROLE_NAMEfrom DIAN_SYSTEM_USER_ROLE uinner join DIAN_SYSTEM_ROLE roleon u.ROLE_ID = role.ROLE_ID and role.TENANT_ID = u.TENANT_ID androle.DEL_FLAG = 0 and role.IS_ENABLE = 1 and role.BASE_DEPT_ID = u.BASE_DEPT_IDwhere  role.SYSTEM_TYPE = 'DIAN'and u.IS_ENABLE = 1 --账户“启用”的状态下and u.DEL_FLAG = 0and u.TENANT_ID = v_tenant_idand U.USER_ID = v_user_idand u.BASE_DEPT_ID = v_base_dept_idorder by role.ROLE_LEVEL desc)  --按角色级别进行升序排列where rownum = 1;
else  --未分配角色给用户end if;SELECT BASE_DEPT_ID --存储所属基地IDINTO v_base_dept_idFROM DIAN_USER_ACCOUNTWHERE TENANT_ID= v_tenant_idAND USER_ID = v_user_idAND DEL_FLAG = 0AND IS_ENABLE = 1AND 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);--存储登录用户所属基地IDapex_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 );exceptionwhen others thenv_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 ;
/