ITPub博客

首页 > Linux操作系统 > Linux操作系统 > SAP BPS:Web 权限实现新思路

SAP BPS:Web 权限实现新思路

原创 Linux操作系统 作者:leniz 时间:2011-07-27 12:25:06 0 删除 编辑
    之前也实现过,但是感觉不通用,这样以后维护起来麻烦,所以做了优化。
 
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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-05-31

  • 博文量
    448
  • 访问量
    1128224