zoukankan      html  css  js  c++  java
  • 如何设计和使用自定义的权限对象(自定义权限检查函数)

    在sap扩展中用户往往都需要使用自己的权限对象,为了达到次目的,请按下列步骤建立和维护权限对象

    1、Create an Anthorization Field(SU20)创建权限对象字段(存储在AUTHX表中)

    2、Create an Authorization Object(SU21) 创建权限对象 
    创建权限对象类别(存储在TOBCT表中)
    点击对象类别创建权限对象(存储在TOBJ表中),生成SAP_ALL

    3、Assign an Authorization Object to an Object Class(SU02或PFCG)

    4、权限赋值关系图

                            user  master record
                            /  ............................../
                auth. profile              Composite auth. profile
                  /................./                      /                  /
                 /                   /                    /                    /
      Authorization                                            Auth. Profile
         /                                                               /................./          

    5、Call "Authorith-Check" in Program  to Check Authorization.

    这是我编写针对具体权限对象替代Authorith-Check的函数

    form zcustcheckauth using  value(z_vkbur) like vbak-vkbur
                         z_return type i.
    data: wa_ust12 like ust12.
    data: bgetsubfile(1) type c.
    data: begin of db_file occurs 10,
             profile like ust04-profile,
             typ     like usr10-typ,
          end of db_file.

    data: begin of mid_db_file occurs 10,
             profile like ust04-profile,
             typ     like usr10-typ,
          end of mid_db_file.

    data: begin of db_file_end occurs 10,
             profile like ust04-profile,
          end of db_file_end.

    data: begin of db_auth occurs 10,
             objct like ust10s-objct,
             auth like ust10s-auth,
          end of db_auth.

       z_return = 4.
       select ust04~profile usr10~typ
         into corresponding fields of table db_file
         from ust04
           inner join usr10 on usr10~profn = ust04~profile
             and usr10~aktps = 'A'
       where ust04~bname = sy-uname.

       refresh mid_db_file.
       clear mid_db_file.
       loop at db_file.
          if db_file-typ <> 'C'.
            db_file_end-profile = db_file-profile.
            append db_file_end to db_file_end.
          else.
            bgetsubfile = 'X'.
            append db_file to mid_db_file.
          endif.
       endloop.
       refresh db_file.
       clear db_file.

       while bgetsubfile = 'X'.
         bgetsubfile = space.
         select ust10c~subprof as profile usr10~typ
           into corresponding fields of table db_file
         from ust10c
           inner join usr10 on usr10~profn =  ust10c~subprof
             and usr10~aktps = 'A'
         for all entries in mid_db_file
         where ust10c~profn = mid_db_file-profile.

         refresh mid_db_file.
         clear mid_db_file.
         loop at db_file.
          if db_file-typ <> 'C'.
            db_file_end-profile = db_file-profile.
            append db_file_end to db_file_end.
          else.
            bgetsubfile = 'X'.
            append db_file to mid_db_file.
          endif.
         endloop.
         refresh db_file.
         clear db_file.
       endwhile.

       select objct auth into corresponding fields of table db_auth
       from ust10s
       for all entries in db_file_end
       where ust10s~aktps = 'A' and ust10s~profn = db_file_end-profile.

       select von bis into corresponding fields of wa_ust12
         from ust12
         for all entries in db_auth
         where ust12~aktps = 'A' and ust12~field = 'VKBUR'
           and ust12~objct = db_auth-objct
           and ust12~auth = db_auth-auth.

         if ( wa_ust12-bis ne space ).
            if ( z_vkbur ge wa_ust12-von ).
              if ( z_vkbur le wa_ust12-bis ).
                z_return = 0.
                exit.
              endif.
            endif.
         elseif ( z_vkbur = wa_ust12-von ).
           z_return = 0.
           exit.
         elseif ( '*' = wa_ust12-von ).
           z_return = 0.
           exit.
         endif.
       endselect.
    endform.
    调用的方法

    *&---------------------------------------------------------------------*
    *&      Form  USEREXIT_CHECK_VBAK
    *&---------------------------------------------------------------------*
    *                                                                     *
    *       This Userexit can be used to add additional logic for         *
    *       checking the header for completeness and consistency.         *
    *                                                                     *
    *       US_DIALOG  -  Indicator, that can be used to suppress         *
    *                     dialogs in certain routines, e.g. in a          *
    *                     copy routine.                                   *
    *                                                                     *
    *       This form is called from form VBAK_PRUEFEN.                   *
    *                                                                     *
    *---------------------------------------------------------------------*
    form userexit_check_vbak using us_dialog.
    *{   INSERT         DEVK901354                                        1
     data: z_s_vkbur like knvv-vkbur.
     data: z_auth_check type i value 4.
     if sy-tcode = 'VA01' or
        sy-tcode = 'VA02'.
       authority-check object 'V_VBKA_VKO'
                     id 'VKORG' dummy
                     id 'VTWEG' dummy
                     id 'SPART' dummy
                     id 'VKBUR' field vbak-vkbur
                     id 'VKGRP' dummy
                     id 'KTAAR' dummy
                     id 'ACTVT' dummy.
       if  sy-subrc ne 0.
         message e900(zdev).
       endif."不能创建非主管商家订单
       if sy-tcode eq 'VA01'.
         select single vkbur into z_s_vkbur
         from knvv
         where knvv~kunnr =  vbak-kunnr
           and knvv~vkorg =  vbak-vkorg
           and knvv~vtweg =  vbak-vtweg
           and knvv~spart =  vbak-spart
           and knvv~vkbur =  vbak-vkbur.
         if sy-subrc ne 0.
           message e001(zdev).
         endif.
       endif.
     else.
       perform zcustcheckauth using vbak-vkbur z_auth_check.

       if  z_auth_check ne 0.  "如果没有权限,取当前商家主管销售组
         select single vkbur into z_s_vkbur
         from knvv
         where knvv~kunnr =  vbak-kunnr.
         if sy-subrc ne 0.
           message e001(zdev).
         endif.    "检查当前商家主管销售组是否在用户权限内
         z_auth_check = 4.
         perform zcustcheckauth using z_s_vkbur z_auth_check.
         if z_auth_check ne 0.
           message e900(zdev).
         endif.
      endif.
     endif.
    *}   INSERT


    endform.

  • 相关阅读:
    iscsi-分区类型
    NFS
    测试目录
    测试
    函数
    循环、枚举、条件判断、选择排序
    格式化、列表、元组、字典、集合
    常量、注释、变量、堆栈、数据类型、强制转换
    站点迁移至https://traceless.site/
    CENTOS7 源码安装NGINX
  • 原文地址:https://www.cnblogs.com/xiaomaohai/p/6157537.html
Copyright © 2011-2022 走看看