SAP BPS:Web 許可權實現新思路

leniz發表於2011-07-27
    之前也實現過,但是感覺不通用,這樣以後維護起來麻煩,所以做了優化。
 
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 .
  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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章