之前也实现过,但是感觉不通用,这样以后维护起来麻烦,所以做了优化。
1. Web 页面要控制的不外乎Button和Layout,同时Class对着两个对象都是不同的,所以需要判断所需控件的实际对象
2. 通用性方面,我希望能够做到,所有的application 使用统一的增强,这样复杂度会低很多
3. 权限的添加可以很顺畅的实现,不要惊动OEM,比如说,我
1. 建立一个信息对象(InfoObject),用于存放权限对象值(就是页面要控制的控件名称-不完全是,因为我加了web程序名作为前缀)- 这样做是有目的的, 另外我将web程序名作为信息对象的属性,-这样做也是有目的的
2. 因为要在程序中直接提取用户权限列表, BPS有现成的函数: API_SEMBPS_VARIABLE_GETDETAIL ,那我肯定就是套用为好,最重要的是,这个函数只会提取当前用户的权限值,简直是绝配。
3. 一个web 程序,如何去做权限管控呢? 我的思路是,把web上的操作和控件关联起来,无非就是layout控制输入,button控制执行,所以我只需要控制这两样就够了。
4. 如何控制? 没权限,要不就不显示,要不就不使能, 综合之后,发现不使能比较好操作。
5. 那么怎么去判断当前程序有哪些要判断权限呢? 做过权限开发的人,估计都很容易想到。 一定会有一个权限对象列表,把系统的权限和控件关联起来。 而我采用信息对象的值和控件名称关联,即凡是存在信息对象中,并且属性值为web程序名的,即为所需要控制的控件。(当然,这里不完全,因为我用了程序名做前缀,原因是,权限函数只会返回信息对象的值,而没有程序名属性) , 所以有了这个前缀值,可以快速的获取web程序内,用户的权限清单。
具体步骤:
1. 建立InfoObject,加入一个属性即用于存储Web 程序名(BPS_WB建立)
2. SE24 继承CL_UPWB_BSP_APPL,新增一个类。
3. Web 程序用之前建立的类作为新的“应用程序类 ”
具体代码:
1. 信息对象值
控件值 Web程序名 权限名称
ZBPSPLANCTPM_BT_COPY ZBPSPLANCTPM 销售版生产-月度-复制
2. 继承类中重新定义LOAD 方法
METHOD load.
*TRY.
CALL METHOD super->load
EXPORTING
application_name = application_name
* storage_type =
RECEIVING
application = application
.
*ENDTRY.
******
* 在web中最常见的是LAYOUT 和button,所以权限管控,应该着眼于此即可。
* 如何去区别到底是layout还是button呢? 通过前缀: LY - LAYOUT , BT - BUTTON
* 对它的两种类型的权限进行循环判断,
* 遍历所有的LAYOUT,button,
* layout 可是通过设置 只读,所以需要在只读与写之间切换
* button 没有能否的设置,但是有可见不可见的设置,所以,可以通过设置这个来实践权限管控
*****
DATA:
l_subrc LIKE sy-subrc,
lt_cha TYPE STANDARD TABLE OF upc_ys_cha,
lto_varsel_all TYPE upc_yto_charsel,
lto_varsel TYPE upc_yto_charsel,
lto_var TYPE upc_yto_charsel,
lto_chanm TYPE upc_yto_cha,
ls_varsel_all TYPE upc_ys_api_varsel,
lt_varsel_all TYPE STANDARD TABLE OF upc_ys_api_varsel.
DATA: ls_varsel TYPE upc_ys_charsel,
l_comp(4) TYPE c,
l_entries TYPE i.
** conditions to filter the approbiate component
DATA: l_layout TYPE REF TO if_upwb_c_layout2,
l_button TYPE REF TO if_upwb_c_button,
l_class TYPE string.
DATA:
lr_component TYPE REF TO if_upwb_c_component,
l_web_comp TYPE string,
lr_tabstrp TYPE REF TO if_upwb_c_tab_strip.
DATA: BEGIN OF wa_layout ,
version(2),
layout(22),
END OF wa_layout.
DATA: it_layout LIKE TABLE OF wa_layout.
DATA: l_ver(2).
DATA: it TYPE TABLE OF zsave,
wa LIKE LINE OF it.
DATA: l_line TYPE d.
DATA:l_flag(1) VALUE 'X'.
DATA:app_len TYPE i,comp_len TYPE i .
DATA:l_str TYPE string,comp_tp(2).
DATA:BEGIN OF wa_ctrl_comp, "获取控件名称
tp(2), "控件类型
name(20), "控件名称
END OF wa_ctrl_comp.
DATA: it_ctrl_comp LIKE TABLE OF wa_ctrl_comp.
DATA: l_auth_comp(40).
DATA: l_application_name TYPE string.
l_application_name = application_name.
TRANSLATE l_application_name TO UPPER CASE.
app_len = STRLEN( application_name ).
comp_len = app_len + 1.
****** 获取所有控件名称
SELECT /bic/zbutton INTO l_auth_comp
FROM /bic/pzbutton
WHERE /bic/zapp_name = l_application_name.
wa_ctrl_comp-tp = l_auth_comp+comp_len(2).
wa_ctrl_comp-name = l_auth_comp+comp_len.
TRANSLATE wa_ctrl_comp-tp TO UPPER CASE.
TRANSLATE wa_ctrl_comp-name TO UPPER CASE.
APPEND wa_ctrl_comp TO it_ctrl_comp.
ENDSELECT.
****对所有加控控件,进行使能操作
LOOP AT it_ctrl_comp INTO wa_ctrl_comp.
CASE wa_ctrl_comp-tp.
WHEN 'BT'.
l_web_comp = wa_ctrl_comp-name.
lr_component = cl_upwb=>get_component( is_id = l_web_comp ).
l_button ?= lr_component.
TRY.
CALL METHOD l_button->set_disabled
EXPORTING
i_value = 'X'.
ENDTRY.
WHEN 'LY'.
l_web_comp = wa_ctrl_comp-name.
lr_component = cl_upwb=>get_component( is_id = l_web_comp ).
l_layout ?= lr_component.
*
TRY.
CALL METHOD l_layout->set_read_only
EXPORTING
* i_value = '-'.
i_value = 'X'.
* CALL METHOD l_layout->set_allow_new_lines
* EXPORTING
* i_value = ''.
ENDTRY.
ENDCASE.
ENDLOOP.
CLEAR:it_ctrl_comp[].
*
CALL FUNCTION 'API_SEMBPS_VARIABLE_GETDETAIL'
EXPORTING
i_area = 'ZBSPLN01'
i_variable = 'ZBT' "AUTHORIZATION VARIABLE
IMPORTING
e_subrc = l_subrc
TABLES
etk_cha = lt_cha
etk_varsel_all = lt_varsel_all.
*
***** 获取当前用户对应的程序名下的权限,这个是开的权限
*
LOOP AT lt_varsel_all INTO ls_varsel_all .
IF ls_varsel_all-low CS application_name.
wa_ctrl_comp-tp = ls_varsel_all-low+comp_len(2).
wa_ctrl_comp-name = ls_varsel_all-low+comp_len.
TRANSLATE wa_ctrl_comp-tp TO UPPER CASE.
TRANSLATE wa_ctrl_comp-name TO UPPER CASE.
APPEND wa_ctrl_comp TO it_ctrl_comp.
ENDIF.
ENDLOOP.
LOOP AT it_ctrl_comp INTO wa_ctrl_comp.
CASE wa_ctrl_comp-tp.
WHEN 'BT'.
l_web_comp = wa_ctrl_comp-name.
lr_component = cl_upwb=>get_component( is_id = l_web_comp ).
l_button ?= lr_component.
TRY.
CALL METHOD l_button->set_disabled
EXPORTING
i_value = '-'.
ENDTRY.
WHEN 'LY'.
l_web_comp = wa_ctrl_comp-name.
lr_component = cl_upwb=>get_component( is_id = l_web_comp ).
l_layout ?= lr_component.
*
TRY.
CALL METHOD l_layout->set_read_only
EXPORTING
i_value = '-'.
ENDTRY.
ENDCASE.
ENDLOOP.
*TRY.
CALL METHOD super->load
EXPORTING
application_name = application_name
* storage_type =
RECEIVING
application = application
.
*ENDTRY.
******
* 在web中最常见的是LAYOUT 和button,所以权限管控,应该着眼于此即可。
* 如何去区别到底是layout还是button呢? 通过前缀: LY - LAYOUT , BT - BUTTON
* 对它的两种类型的权限进行循环判断,
* 遍历所有的LAYOUT,button,
* layout 可是通过设置 只读,所以需要在只读与写之间切换
* button 没有能否的设置,但是有可见不可见的设置,所以,可以通过设置这个来实践权限管控
*****
DATA:
l_subrc LIKE sy-subrc,
lt_cha TYPE STANDARD TABLE OF upc_ys_cha,
lto_varsel_all TYPE upc_yto_charsel,
lto_varsel TYPE upc_yto_charsel,
lto_var TYPE upc_yto_charsel,
lto_chanm TYPE upc_yto_cha,
ls_varsel_all TYPE upc_ys_api_varsel,
lt_varsel_all TYPE STANDARD TABLE OF upc_ys_api_varsel.
DATA: ls_varsel TYPE upc_ys_charsel,
l_comp(4) TYPE c,
l_entries TYPE i.
** conditions to filter the approbiate component
DATA: l_layout TYPE REF TO if_upwb_c_layout2,
l_button TYPE REF TO if_upwb_c_button,
l_class TYPE string.
DATA:
lr_component TYPE REF TO if_upwb_c_component,
l_web_comp TYPE string,
lr_tabstrp TYPE REF TO if_upwb_c_tab_strip.
DATA: BEGIN OF wa_layout ,
version(2),
layout(22),
END OF wa_layout.
DATA: it_layout LIKE TABLE OF wa_layout.
DATA: l_ver(2).
DATA: it TYPE TABLE OF zsave,
wa LIKE LINE OF it.
DATA: l_line TYPE d.
DATA:l_flag(1) VALUE 'X'.
DATA:app_len TYPE i,comp_len TYPE i .
DATA:l_str TYPE string,comp_tp(2).
DATA:BEGIN OF wa_ctrl_comp, "获取控件名称
tp(2), "控件类型
name(20), "控件名称
END OF wa_ctrl_comp.
DATA: it_ctrl_comp LIKE TABLE OF wa_ctrl_comp.
DATA: l_auth_comp(40).
DATA: l_application_name TYPE string.
l_application_name = application_name.
TRANSLATE l_application_name TO UPPER CASE.
app_len = STRLEN( application_name ).
comp_len = app_len + 1.
****** 获取所有控件名称
SELECT /bic/zbutton INTO l_auth_comp
FROM /bic/pzbutton
WHERE /bic/zapp_name = l_application_name.
wa_ctrl_comp-tp = l_auth_comp+comp_len(2).
wa_ctrl_comp-name = l_auth_comp+comp_len.
TRANSLATE wa_ctrl_comp-tp TO UPPER CASE.
TRANSLATE wa_ctrl_comp-name TO UPPER CASE.
APPEND wa_ctrl_comp TO it_ctrl_comp.
ENDSELECT.
****对所有加控控件,进行使能操作
LOOP AT it_ctrl_comp INTO wa_ctrl_comp.
CASE wa_ctrl_comp-tp.
WHEN 'BT'.
l_web_comp = wa_ctrl_comp-name.
lr_component = cl_upwb=>get_component( is_id = l_web_comp ).
l_button ?= lr_component.
TRY.
CALL METHOD l_button->set_disabled
EXPORTING
i_value = 'X'.
ENDTRY.
WHEN 'LY'.
l_web_comp = wa_ctrl_comp-name.
lr_component = cl_upwb=>get_component( is_id = l_web_comp ).
l_layout ?= lr_component.
*
TRY.
CALL METHOD l_layout->set_read_only
EXPORTING
* i_value = '-'.
i_value = 'X'.
* CALL METHOD l_layout->set_allow_new_lines
* EXPORTING
* i_value = ''.
ENDTRY.
ENDCASE.
ENDLOOP.
CLEAR:it_ctrl_comp[].
*
CALL FUNCTION 'API_SEMBPS_VARIABLE_GETDETAIL'
EXPORTING
i_area = 'ZBSPLN01'
i_variable = 'ZBT' "AUTHORIZATION VARIABLE
IMPORTING
e_subrc = l_subrc
TABLES
etk_cha = lt_cha
etk_varsel_all = lt_varsel_all.
*
***** 获取当前用户对应的程序名下的权限,这个是开的权限
*
LOOP AT lt_varsel_all INTO ls_varsel_all .
IF ls_varsel_all-low CS application_name.
wa_ctrl_comp-tp = ls_varsel_all-low+comp_len(2).
wa_ctrl_comp-name = ls_varsel_all-low+comp_len.
TRANSLATE wa_ctrl_comp-tp TO UPPER CASE.
TRANSLATE wa_ctrl_comp-name TO UPPER CASE.
APPEND wa_ctrl_comp TO it_ctrl_comp.
ENDIF.
ENDLOOP.
LOOP AT it_ctrl_comp INTO wa_ctrl_comp.
CASE wa_ctrl_comp-tp.
WHEN 'BT'.
l_web_comp = wa_ctrl_comp-name.
lr_component = cl_upwb=>get_component( is_id = l_web_comp ).
l_button ?= lr_component.
TRY.
CALL METHOD l_button->set_disabled
EXPORTING
i_value = '-'.
ENDTRY.
WHEN 'LY'.
l_web_comp = wa_ctrl_comp-name.
lr_component = cl_upwb=>get_component( is_id = l_web_comp ).
l_layout ?= lr_component.
*
TRY.
CALL METHOD l_layout->set_read_only
EXPORTING
i_value = '-'.
ENDTRY.
ENDCASE.
ENDLOOP.
******以上完毕,
当然,非常重要的是,你必须在Web 程序中,规范的定义Button名称(BT_*****),Layout
名称(LY_****).
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/554557/viewspace-703208/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/554557/viewspace-703208/