程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python解CCF-CSP真題《202206-3—角色授權》

編輯:Python

想查看其他題的真題及題解的同學可以前往查看:CCF-CSP真題附題解大全

試題編號:202206-3試題名稱:角色授權時間限制:5.0s內存限制:512.0MB問題描述:

題目背景

為了響應國家發展新基建的倡議,西西艾弗島上興建了西西艾弗數據中心,並以此為基礎運營了西西艾弗雲。作為數據中心的運營和維護方,
西西艾弗雲公司十分重視西西艾弗雲的網絡安全管理工作。眾所周知,安全性和便捷性難以兼得,同時,
一個混亂的權限模型可能會導致人員被授予不必要的權限,從而造成安全風險。因此在西西艾弗雲公司的網絡安全部工作的小 C
專門設計了一種科學的權限模型。

這種安全模型將驗證流程分為兩個步驟。第一步是驗證用戶的身份(鑒別),第二步是驗證用戶的權限(授權)。在第一步,
首先驗證一個用戶是否是該用戶所聲稱的那個身份。例如,通過驗證用戶提供的口令(Password)是否正確,或者通過驗證用戶提供的智能卡是否合法有效。
接下來,在授權的步驟中,權限策略會被檢索以便判斷來訪的用戶是否能夠操作系統中的某個資源。

為了能夠靈活地表達用戶和授權之間的關系,西西艾弗雲公司設計了一種簡潔而靈活的授權模型:基於角色的授權模型。它的思路是:首先設定若干角色,
每個角色中指明了一個清單,表明允許訪問的資源的種類、資源的名稱和對資源的操作;然後將被前一步驟已經鑒別過的用戶和一個或多個角色相關聯。
某個用戶能夠執行的操作,即為與其關聯的全部角色中允許的操作的並集。

小 C 將實現授權模型的工作交給了你,希望你能夠把它們實現出來。

問題描述

用戶表示授權模型中的一個已識別的主體,該識別過程由此前的鑒別過程完成。一個用戶具有下列要素:

  • 名稱:是一個字符串,用於唯一標識一個用戶;
  • 用戶組:是一個數組,包含若干個字符串,表示該用戶所屬的用戶組。

一個待授權的行為,包括下列要素:

  • 主體:是一個用戶,包括試圖進行該行為的用戶的名稱和該用戶所屬的用戶組;
  • 操作:是一個字符串,一般是一個動詞,例如 ReadOpenClose 等;
  • 資源:表示該行為的操作對象,由資源種類和資源名稱描述。資源種類例如 DoorFile 等;在一個特定的資源種類中,資源名稱唯一確定了一個資源。

需要注意的是,一個待授權的行為的主體信息,即用戶名稱和所屬用戶組,是由前一步驟的鑒別過程完成的。因此,每次授權過程中,
每個待授權的行為都會包含主體用戶和其關聯的用戶組的信息。由於鑒權過程中的其它因素,同一個名稱的用戶在先後兩次待授權的行為中所屬的用戶組可能有區別,
不能存儲或記憶此前每個待授權的行為中,用戶與用戶組的關聯情況,而是要按照每次待授權的行為中給出的信息獨立判斷。

角色是這種授權模型的基本單位,它指明了一個用戶可以執行的操作,角色的清單中描述了角色所允許的操作。一個角色包含下列要素:

  • 名稱,是一個字符串,用於唯一標識一個角色;
  • 操作清單,是一個數組,包含一個或多個操作,表示該角色允許執行的操作集合;
  • 資源種類清單,是一個數組,包含一個或多個資源種類,表示該角色允許操作的資源的種類集合;
  • 資源名稱清單,是一個數組,包含若干個資源名稱,表示該角色允許操作的資源的名稱集合。

判斷一個角色能否對某個資源執行某個操作的過程是:

  1. 檢查該角色的操作清單,如果該角色的操作清單中不包含該操作,且該角色的操作清單中也不包含字符串 *,那麼不能執行該操作;
  2. 檢查該角色的資源種類清單,如果該角色的資源種類清單中不包含該資源的種類,且該角色的資源種類清單中也不包含字符串 *,那麼不能執行該操作;
  3. 檢查該角色的資源名稱清單,如果該角色的資源名稱清單中不包含該資源的名稱,且該角色的資源名稱清單不是空數組,那麼不能執行該操作;
  4. 允許執行該操作。

例如,假設有某個角色 Doorman,其允許執行的操作有 Open 和 Close,其允許操作的資源類型有 Door,其允許操作的資源名稱有 FrontDoor 和 BackDoor
如果某用戶與這個角色關聯,那麼該用戶可以對名為 FrontDoor 的 Door 執行 Open 操作,但是不能對 BackDoor 的 Door 執行 Delete 操作。
同時,一個角色能允許進行的操作可以用通配符來表示。例如,另有一個角色 Admin,其允許執行的操作有 *,允許操作的資源類型是 *,其允許操作的資源名稱列表為空,
那麼與該角色關聯的所有用戶可以執行任何操作。值得注意的是,一個角色的操作清單,只能用允許列表的方式列舉該角色允許進行的操作,而不能禁止角色進行某個操作。

角色關聯指明了一個用戶和一個或多個角色之間的關系。一個角色關聯包含下列要素:

  • 角色名稱,是一個字符串,用於指明一個角色;
  • 授權對象清單,是一個數組,包含一個或多個用戶名稱或者用戶組名稱,表示該角色關聯的用戶和用戶組的集合。

判斷一個用戶能否執行某個操作的過程是:

  1. 檢查所有的角色關聯的授權對象清單,如果清單中包含該用戶的名稱,或者該清單中包含該用戶所屬的某一個用戶組的名稱,那麼選取該角色關聯所關聯的角色;
  2. 對於所有被選取的角色,判斷這些角色是否能對該資源執行該操作,如果所有角色都不能執行該操作,那麼不能執行該操作;
  3. 允許執行該操作。

由此可見,一個角色關聯可以將一個角色與多個用戶或用戶組關聯起來。例如,如果有一個角色關聯,其關聯的角色名稱為 Doorman,其關聯的用戶和用戶組清單為
用戶 foo1、用戶 foo2、用戶組 bar。那麼這些用戶會與 Doorman 角色關聯:

  • 名為 foo1 的用戶,屬於用戶組 bar
  • 名為 foo2 的用戶,屬於用戶組 barz
  • 名為 foo3 的用戶,屬於用戶組 bar 和 barz

但是,屬於用戶組 barz 的名為 foo4 的用戶不能與 Doorman 的角色關聯。

從上述判斷規則可以知道,一個用戶可能與多個角色相關聯,在這種情況下,該用戶允許進行的操作是這些角色被允許進行的操作集合的並集

輸入格式

從標准輸入讀入數據。

輸入的第一行包含三個正整數 n、m、q,分別表示角色數量、角色關聯數量和待檢查的操作數量。

輸入接下來的 n 行中,每行表示一個角色,包括空格分隔的若干元素,依次為:

  • 一個字符串,表示該角色的名稱;
  • 一個正整數 nv,表示操作清單中包含的操作數量;
  • nv 個字符串,依次表示操作清單中的操作;
  • 一個正整數 no,表示資源種類清單中包含的資源種類的數量;
  • no 個字符串,依次表示資源種類清單中的資源種類;
  • 一個非負整數 nn,表示資源名稱清單中包含的資源名稱的數量;
  • nn 個字符串,依次表示資源名稱清單中的資源名稱。

輸入接下來的 m 行中,每行表示一個角色關聯,包括空格分隔的若干元素,依次為:

  • 一個字符串,表示該角色關聯的角色名稱;
  • 一個正整數 ns,表示授權對象清單中包含的授權對象的數量;
  • 2ns 個字符串,每兩個表示授權對象清單中的授權對象,前一個字符串為 u 或 g,分別表示這個授權對象是一個用戶名稱或者用戶組名稱,後一個字符串為用戶名稱或者用戶組名稱。

輸入接下來的 q 行中,每行表示一個待授權的行為,包括空格分隔的若干元素,依次為:

  • 一個字符串,表示執行該操作的用戶名稱;
  • 一個正整數 ng,表示該用戶所屬的用戶組的數量;
  • ng 個字符串,依次表示該用戶所屬的用戶組的名稱;
  • 一個字符串,表示待查操作的名稱;
  • 一個字符串,表示被操作的資源種類;
  • 一個字符串,表示被操作的資源名稱。

輸出格式

輸出到標准輸出。

輸出 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% 的數據,有:

  • 1≤n,m≤500;
  • 1≤q≤5000;
  • 1≤nv,no,ns,ng≤400;
  • 0≤nn≤400;
  • 全部字符串或為 *,或僅包含大寫字母、小寫字母、數字(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


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved