【开发问题&解决方法记录】05.dian 多角色切换&基地隔离

发布时间:2023年12月18日

校验输入的只能是字母数字,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 ;
/

文章来源:https://blog.csdn.net/clover_oreo/article/details/134862443
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。