09技术太卷我学APEX-定制页面及导航菜单权限

本文介绍了如何在APEX中实现自定义页面权限和导航菜单的控制。作者通过创建数据库表来管理用户、角色和页面的关系,然后利用授权方案和控制函数进行权限验证。文章详细展示了从角色管理、页面授权到导航菜单动态生成的全过程,并提供了效果DEMO。
摘要由CSDN通过智能技术生成

09技术太卷我学APEX-定制页面及导航菜单权限

0 始终没搞明白APEX的角色如果分配页面的权限,只能自己定制一个

APEX现学现卖开发了个《5217仓库管理》,功能在春节前就搞定了,卡在对页面的权限控制,经过翻阅牛人的博客,结合自己的经验终于搞定了。

1 权限管理设计

每个页面配置给自定义角色功能权限,也就是能看到和操作,还有页面对应的导航菜单,然后自定义用户可以配置多个角色,用户通过角色可以获得角色的功能权限。关系图大概如下图:

用户角色页面ID
白龙马系统管理10099
10100
10110
库管410
420

一个用户对多个角色,一个角色对多个页面。

1.1 数据库表设计

需要创建4个系统表,保存用户、角色及页面之间的关系。

  • 角色表(角色ID,角色名称)
  • 角色页面表(角色ID,页面ID)
  • 用户表(用户ID,用户姓名,密码)
  • 用户角色表(用户ID,角色ID)
--角色表
CREATE TABLE  "SYS_ROLE" 
   (	"P_ID" NUMBER(17,0) NOT NULL ENABLE, 
	"ROLE_NAME" VARCHAR2(17) NOT NULL ENABLE, 
	"S_NOTE" VARCHAR2(52), 
	 CONSTRAINT "SYS_ROLE_PK" PRIMARY KEY ("P_ID")
  USING INDEX  ENABLE, 
	 CONSTRAINT "SYS_ROLE_NAME" UNIQUE ("ROLE_NAME")
  USING INDEX  ENABLE
   )

--角色页面表
CREATE TABLE  "SYS_ROLE_PAGE" 
   (	"P_ID" NUMBER(17,0) NOT NULL ENABLE, 
	"ROLE_NAME" VARCHAR2(17) NOT NULL ENABLE, 
	"PAGE_ID" NUMBER(17,0) NOT NULL ENABLE, 
	"S_NOTE" VARCHAR2(52), 
	 CONSTRAINT "SYS_ROLE_PAGE_PK" PRIMARY KEY ("P_ID")
  USING INDEX  ENABLE, 
	 CONSTRAINT "SYS_ROLE_PAGE_UK1" UNIQUE ("ROLE_NAME", "PAGE_ID")
  USING INDEX  ENABLE
   )

--用户表
CREATE TABLE  "SYS_USER" 
   (	"P_ID" NUMBER(13,0) NOT NULL ENABLE, 
	"USER_NAME" VARCHAR2(17) NOT NULL ENABLE, 
	"PASS_WORD" VARCHAR2(17) NOT NULL ENABLE, 
	"S_MOBILE" VARCHAR2(17), 
	"S_EMAIL" NVARCHAR2(52), 
	"NICK_NAME" VARCHAR2(17), 
	 CONSTRAINT "SYS_USER_PK" PRIMARY KEY ("P_ID")
  USING INDEX  ENABLE, 
	 CONSTRAINT "SYS_USER_UK1_USER_NAME" UNIQUE ("USER_NAME")
  USING INDEX  ENABLE, 
	 CONSTRAINT "SYS_USER_UK2_S_MOBILE" UNIQUE ("S_MOBILE")
  USING INDEX  ENABLE, 
	 CONSTRAINT "SYS_USER_UK3_S_EMAIL" UNIQUE ("S_EMAIL")
  USING INDEX  ENABLE
   )

--用户角色表
CREATE TABLE  "SYS_USER_ROLE" 
   (	"P_ID" NUMBER(17,0) NOT NULL ENABLE, 
	"USER_NAME" VARCHAR2(17) NOT NULL ENABLE, 
	"ROLE_NAME" VARCHAR2(17) NOT NULL ENABLE, 
	"S_NOTE" VARCHAR2(52), 
	 CONSTRAINT "SYS_USER_ROLE_PK" PRIMARY KEY ("P_ID")
  USING INDEX  ENABLE, 
	 CONSTRAINT "SYS_USER_ROLE_UK1" UNIQUE ("USER_NAME", "ROLE_NAME")
  USING INDEX  ENABLE
   )

2 创建5个管理页面

2.1 角色管理

交互网格带编辑
在这里插入图片描述

2.2 角色页面管理

交互网格带编辑
在这里插入图片描述
创建角色值列表
在这里插入图片描述

创建页面值列表
在这里插入图片描述

select t.page_alias,t.page_id,t.page_name,t.page_title,t.page_mode,t.page_function
from APEX_APPLICATION_PAGES t 
where application_id = :APP_ID

这里用到了APEX的视图;
两个值列表配置到角色和页面ID列。

2.3 用户管理

交互式网格+表单
在这里插入图片描述
在这里插入图片描述

2.4 用户角色管理

交互式网格加编辑
在这里插入图片描述

创建用户值列表
在这里插入图片描述
用户和角色值列表配置到用户和角色。

2.5 系统管理

在这里插入图片描述

以上4个页面做一个系统管理导航卡列表。

在这里插入图片描述

3 创建授权方案

3.1 创建一个授权控制函数F_CONTROL在这里插入图片描述

create or replace function "F_CONTROL"
(p_username in VARCHAR2,
 p_pageid in number)
return boolean
is
    b_ret boolean :=false;
    c_1 number;
begin
    select count(1) into c_1 from v_sys_user_role_page
        where user_name = p_username and page_id = p_pageid;
    if (c_1 >= 1) then 
        b_ret := true;
    else
        b_ret := false;
    end if;   
    return b_ret;
   
    exception when others then
        return false; 
end;

3.2 创建授权方案

在这里插入图片描述
名称:随便自己输入
方案类型:返回布尔值的PL/SQL函数
PL/SQL函数体:传入当前登录用户和当前页面
求值点:每次页访问一次

4 页面授权控制

设置需求授权的页面设置安全性如下图:
在这里插入图片描述
这样设置后,就是直接在IP地址栏输入页面也需求授权许可。

需要授权的都设置上授权方案:
在这里插入图片描述

5 导航授权控制

设计是这样没有,根据登录帐户,没有授权的页面链接就不在导航菜单上显示了。目前为静态导航菜单,需要引用静态导航菜单的数据创建一个动态的导航菜单。

5.1 创建静态导航菜单的视图

在这里插入图片描述

这里用到APEX的系统视图,代码如下:

CREATE OR REPLACE FORCE EDITIONABLE VIEW "V_MY_MENU" ("PARENT_ENTRY_TEXT", "DISPLAY_SEQUENCE", "ENTRY_TEXT", "PAGE_ID", "ENTRY_TARGET") AS 
  select parent_entry_text,display_sequence,entry_text,
	regexp_replace(entry_target,'[^0-9]') as page_id,entry_target	 
from apex_application_list_entries t
where application_id = 104313 and list_id = 38247996304963868908
order by t.display_sequence

这里用到Oracle的正则表达式替换函数提取出目标的页面id:regexp_replace(entry_target,‘[^0-9]’) as page_id
视图的数据如下:
在这里插入图片描述

5.2 创建动态导航菜单视图

在这里插入图片描述
这里只支持2级菜单。
代码如下:

CREATE OR REPLACE FORCE EDITIONABLE VIEW "CK_MENU_V" ("LEVEL_VALUE", "LABEL_VALUE", "TARGET_VALUE", "IS_CURRENT", "IMAGE_VALUE", "IMAGE_ATTR_VALUE", "IMAGE_ALT_VALUE", "DISPLAY_ORDER", "PAGE_ID") AS 
  select 1 as LEVEL_VALUE,entry_text as LABEL_VALUE,entry_target as TARGET_VALUE, '' as IS_CURRENT,
	ENTRY_IMAGE as IMAGE_VALUE,'' as IMAGE_ATTR_VALUE,'' as IMAGE_ALT_VALUE, display_sequence as DISPLAY_ORDER,
	regexp_replace(entry_target,'[^0-9]') as page_id
from apex_application_list_entries 
where application_id = 104313 and list_id = 38247996304963868908 and parent_entry_text is null
union all
select 2 as LEVEL_VALUE,entry_text as LABEL_VALUE,entry_target as TARGET_VALUE, '' as IS_CURRENT,
	ENTRY_IMAGE as IMAGE_VALUE,'' as IMAGE_ATTR_VALUE,'' as IMAGE_ALT_VALUE, display_sequence as DISPLAY_ORDER,
	regexp_replace(entry_target,'[^0-9]') as page_id
from apex_application_list_entries 
where application_id = 104313 and list_id = 38247996304963868908 and parent_entry_text is not null
order by DISPLAY_ORDER

数据如下:
在这里插入图片描述

5.3 创建一个动态列表并设置为导航菜单

创建动态列表:
在这里插入图片描述
动态列表SQL:

select * from ck_menu_v 
where page_id in (
	select distinct page_id from V_SYS_USER_ROLE_PAGE where user_name = :APP_USER
)

设置以上动态列表为导航菜单:
在这里插入图片描述

6 效果DEMO

到这里总算一切OK了,看一下效果:

6.1 系统管理

在这里插入图片描述

6.2 角色管理

在这里插入图片描述

6.3 角色页面管理

在这里插入图片描述

6.4 用户管理

在这里插入图片描述

6.5 用户角色管理

在这里插入图片描述

6.6 换APEX用户登录

在这里插入图片描述
没有了【系统管理】导航菜单,直接输入页面地址试试

在这里插入图片描述
也访问不了,第一行就是自定义的错误信息。

OK了,一个完整定制验证(验证参阅 01 技术太卷我学APEX-定制验证方案)和授权就完成了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值