SAP BPS:Web 許可權實現新思路
之前也實現過,但是感覺不通用,這樣以後維護起來麻煩,所以做了優化。
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何用 Vue 實現前端許可權控制(路由許可權 + 檢視許可權 + 請求許可權)Vue前端路由
- Laravel實現許可權控制Laravel
- 從0實現RBAC許可權模型模型
- Vue許可權路由實現總結Vue路由
- 基於RBAC實現許可權管理
- SAP Business Application Studio的許可權控制APP
- 使用動態路由實現許可權管理路由
- vue許可權路由實現方式總結Vue路由
- 許可權之選單許可權
- linux 檔案許可權 s 許可權和 t 許可權解析Linux
- vue許可權路由實現方式總結二Vue路由
- SpringBoot(一) 如何實現AOP的許可權控制Spring Boot
- 通過 VirtualApp 實現免 Root 許可權 HookAPPHook
- NODE + JWT + Mongo(簡單實現許可權管理)JWTGo
- 前端許可權控制系統的實現思路前端
- SpringBoot整合SpringSecurityOauth2實現鑑權-動態許可權Spring BootGseOAuth
- 許可權系統:一文搞懂功能許可權、資料許可權
- MySQL許可權管理實戰MySql
- SAP PLM文件許可權物件的控制級別物件
- SAP QM 許可權控制可以到Inspection Type上
- SpringSecurity許可權管理系統實戰—九、資料許可權的配置SpringGse
- SpringAop實現許可權校驗與日誌列印Spring
- 無程式碼實現CRM角色許可權問題
- Hyperf 使用 hyperf-permission 元件實現許可權管理元件
- 淺談許可權管理的設計與實現
- 基於Spring Security實現許可權管理系統Spring
- 通過 recompose 實現 react router4 許可權React
- spring boot 利用註解實現許可權驗證Spring Boot
- spring aop實現簡單的許可權控制功能Spring
- vue+elementUI實現許可權的部門管理VueUI
- 【專案實踐】一文帶你搞定頁面許可權、按鈕許可權以及資料許可權
- Linux特殊許可權之suid、sgid、sbit許可權LinuxUI
- 分享!! 如何自定義許可權校驗的註解並用AOP攔截實現許可權校驗
- Linux許可權Linux
- 許可權控制
- mysql許可權MySql
- springcloud-gateway整合jwt+jcasbin實現許可權控制SpringGCCloudGatewayJWT
- learun通用許可權系統框架功能實現設計框架
- SpringBoot整合Spring security JWT實現介面許可權認證Spring BootJWT