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  .
  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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值