試題編號:202206-3試題名稱:角色授權時間限制:5.0s內存限制:512.0MB問題描述:想查看其他題的真題及題解的同學可以前往查看:CCF-CSP真題附題解大全
為了響應國家發展新基建的倡議,西西艾弗島上興建了西西艾弗數據中心,並以此為基礎運營了西西艾弗雲。作為數據中心的運營和維護方,
西西艾弗雲公司十分重視西西艾弗雲的網絡安全管理工作。眾所周知,安全性和便捷性難以兼得,同時,
一個混亂的權限模型可能會導致人員被授予不必要的權限,從而造成安全風險。因此在西西艾弗雲公司的網絡安全部工作的小 C
專門設計了一種科學的權限模型。
這種安全模型將驗證流程分為兩個步驟。第一步是驗證用戶的身份(鑒別),第二步是驗證用戶的權限(授權)。在第一步,
首先驗證一個用戶是否是該用戶所聲稱的那個身份。例如,通過驗證用戶提供的口令(Password)是否正確,或者通過驗證用戶提供的智能卡是否合法有效。
接下來,在授權的步驟中,權限策略會被檢索以便判斷來訪的用戶是否能夠操作系統中的某個資源。
為了能夠靈活地表達用戶和授權之間的關系,西西艾弗雲公司設計了一種簡潔而靈活的授權模型:基於角色的授權模型。它的思路是:首先設定若干角色,
每個角色中指明了一個清單,表明允許訪問的資源的種類、資源的名稱和對資源的操作;然後將被前一步驟已經鑒別過的用戶和一個或多個角色相關聯。
某個用戶能夠執行的操作,即為與其關聯的全部角色中允許的操作的並集。
小 C 將實現授權模型的工作交給了你,希望你能夠把它們實現出來。
用戶表示授權模型中的一個已識別的主體,該識別過程由此前的鑒別過程完成。一個用戶具有下列要素:
一個待授權的行為,包括下列要素:
Read
、Open
、Close
等;Door
、File
等;在一個特定的資源種類中,資源名稱唯一確定了一個資源。需要注意的是,一個待授權的行為的主體信息,即用戶名稱和所屬用戶組,是由前一步驟的鑒別過程完成的。因此,每次授權過程中,
每個待授權的行為都會包含主體用戶和其關聯的用戶組的信息。由於鑒權過程中的其它因素,同一個名稱的用戶在先後兩次待授權的行為中所屬的用戶組可能有區別,
不能存儲或記憶此前每個待授權的行為中,用戶與用戶組的關聯情況,而是要按照每次待授權的行為中給出的信息獨立判斷。
角色是這種授權模型的基本單位,它指明了一個用戶可以執行的操作,角色的清單中描述了角色所允許的操作。一個角色包含下列要素:
判斷一個角色能否對某個資源執行某個操作的過程是:
*
,那麼不能執行該操作;*
,那麼不能執行該操作;例如,假設有某個角色 Doorman
,其允許執行的操作有 Open
和 Close
,其允許操作的資源類型有 Door
,其允許操作的資源名稱有 FrontDoor
和 BackDoor
。
如果某用戶與這個角色關聯,那麼該用戶可以對名為 FrontDoor
的 Door
執行 Open
操作,但是不能對 BackDoor
的 Door
執行 Delete
操作。
同時,一個角色能允許進行的操作可以用通配符來表示。例如,另有一個角色 Admin
,其允許執行的操作有 *
,允許操作的資源類型是 *
,其允許操作的資源名稱列表為空,
那麼與該角色關聯的所有用戶可以執行任何操作。值得注意的是,一個角色的操作清單,只能用允許列表的方式列舉該角色允許進行的操作,而不能禁止角色進行某個操作。
角色關聯指明了一個用戶和一個或多個角色之間的關系。一個角色關聯包含下列要素:
判斷一個用戶能否執行某個操作的過程是:
由此可見,一個角色關聯可以將一個角色與多個用戶或用戶組關聯起來。例如,如果有一個角色關聯,其關聯的角色名稱為 Doorman
,其關聯的用戶和用戶組清單為
用戶 foo1
、用戶 foo2
、用戶組 bar
。那麼這些用戶會與 Doorman
角色關聯:
foo1
的用戶,屬於用戶組 bar
;foo2
的用戶,屬於用戶組 barz
;foo3
的用戶,屬於用戶組 bar
和 barz
。但是,屬於用戶組 barz
的名為 foo4
的用戶不能與 Doorman
的角色關聯。
從上述判斷規則可以知道,一個用戶可能與多個角色相關聯,在這種情況下,該用戶允許進行的操作是這些角色被允許進行的操作集合的並集。
從標准輸入讀入數據。
輸入的第一行包含三個正整數 n、m、q,分別表示角色數量、角色關聯數量和待檢查的操作數量。
輸入接下來的 n 行中,每行表示一個角色,包括空格分隔的若干元素,依次為:
輸入接下來的 m 行中,每行表示一個角色關聯,包括空格分隔的若干元素,依次為:
u
或 g
,分別表示這個授權對象是一個用戶名稱或者用戶組名稱,後一個字符串為用戶名稱或者用戶組名稱。輸入接下來的 q 行中,每行表示一個待授權的行為,包括空格分隔的若干元素,依次為:
輸出到標准輸出。
輸出 q 行,每行表示一個操作是否可以被執行,0
表示不能執行,1
表示可以執行。
1 2 3
op 1 open 1 door 0
op 1 g sre
op 1 u xiaop
xiaoc 2 sre ops open door room302
xiaop 1 ops open door room501
xiaoc 2 sre ops remove door room302
1
1
0
在本例中,定義了一個名為 op
的角色,授予了對任意 door
類型的對象的 open
操作的權限,同時定義了兩個指向 op
的角色關聯。
注意,可以針對一個角色定義多於一個角色關聯。本例給出了三個待授權的行為。其中,第一個行為,授權的主體用戶是 xiaoc
,
該用戶所屬的用戶組 sre
被關聯 op
角色,因此可以執行開門動作。第二個行為中,授權的主體用戶是 xiaop
,
該用戶被直接關聯了 op
角色,因此也可以執行開門動作。第三個行為中,授權的主體用戶仍是 xiaoc
,關聯的角色仍為 op
。但是,
由於 op
角色並未被授予 remove
操作的權限,因此該動作被拒絕。
對於 20% 的數據,有 n=m=1,且給出的角色類似於題目正文中用於舉例的 Admin
,允許執行任何操作,且 nv=no=ns=ng=1、nn=0。
對於 40% 的數據,有 1≤n,m≤50,且 nv=no=ns=1、ng≤40、nn=0。
對於 70% 的數據,有 1≤n,m≤50,且 nv,no,ns,ng≤40、nn≤400。
對於 100% 的數據,有:
*
,或僅包含大寫字母、小寫字母、數字(A-Za-z0-9
),且字符數目不超過 10。真題來源:角色授權
感興趣的同學可以進去進行練習提交
20分題解:
n, m, q = map(int, input().split())
peoples = [[i for i in map(str,input().split())] for j in range(n)]
datas = [[i for i in map(str,input().split())] for j in range(m)]
points = [[i for i in map(str,input().split())] for j in range(q)]
for point in points:
temp = 0
for data in datas:
for people in peoples:
if data[2] == 'g':
if point[2] == data[3]:
temp = 1
if data[2] == 'u':
if point[0] == data[3]:
temp = 1
if temp == 1:
print(1)
else:
print(0)
運行結果:
ccf-csp練習專欄
https://blog.csdn.net/weixin_53919192/category_11828479.html?spm=1001.2014.3001.5482https://blog.csdn.net/weixin_53919192/category_11828479.html?spm=1001.2014.3001.5482