如有疑問,請看視頻:CAS單點登錄(第7版)
可以使用以下策略實施授權策略以保護 CAS 中的應用程序和依賴方。
-
-
-
- 服務訪問策略
-
-
服務訪問策略允許您定義授權和訪問策略,以控制對向 CAS 注冊的應用程序的入口訪問。此策略通常最適合基于 Web 的應用程序,而不管身份驗證協議如何,并強制執行 Course-grained 訪問策略來描述誰有權訪問給定應用程序。一旦訪問被授予,授權策略以及擴展后的 CAS 本身就完全不再干預,接下來由應用程序自身決定經過身份驗證的主體在應用程序中被允許做什么或訪問什么,這通常基于用戶權限、組成員身份和其他屬性。
在此處(服務與應用)閱讀有關此主題的更多信息。
-
-
-
- 細粒度授權
-
-
細粒度授權將允許您使用專用語言模型構建細粒度權限改造。該策略超越了控制向CAS注冊的應用程序的入口訪問,并允許您定義和開發詳細的授權規則,以確定是否允許訪問給定的API請求、資源或操作。此類API請求通常由API網關代理,該網關將充當PEP(授權執行),將請求路由到CAS,然后充當PDP(策略定義點)。
在此處閱讀有關此主題的更多信息。
Heimdall 是一個簡單的基于規則的授權引擎,其主要職責是接受 HTTP 有效負載形式的授權請求,并以 HTTP 響應代碼的形式返回是允許還是拒絕請求的決定。您可以將此授權引擎放在 API 網關和反向代理后面,以保護您的 API 和服務,并允許它們制定對 CAS 的授權請求,接收響應并將其轉換回調用方。
在北歐神話中,Heimdall是守護入侵者的神和守門人,并被證明擁有先見之明和敏銳的感官。作為看門人,他負責彩虹橋 Bifrost 并密切關注乘客。
一般流程可使用以下步驟進行總結:
- 可授權資源已向 CAS 注冊
- …使用適當的方法、URI、命名空間和上下文
- …使用適當的授權策略
- 授權請求已提交給 CAS
- …與適當的校長/科目
- …使用適當的方法、URI、命名空間和上下文
- CAS 根據請求查找匹配的可授權資源
- …然后根據請求確定主體/主題
- 然后,CAS 會咨詢授權引擎,以根據資源、委托人和請求做出決策
- CAS 向調用方返回響應,接受或拒絕請求
?用法
請注意,CAS 只是充當策略定義點 (PDP) 和策略信息點 (PIP)。授權執行 (PEP) 必須由調用方在其他地方進行,這通常發生在 bean API 網關或 nginx 反向代理等上。
-
-
-
- 配置
-
-
通過在覆蓋中包含以下依賴項來啟用 Heimdall 授權支持:
Apache Maven
Gradle
BOM - Spring
BOM - Gradle
資源
1 2 3 4 5 6 7 8 9 10 | dependencies { ????/* ????????The following platform references should be included automatically and are listed here for reference only. ????????implementation enforcedPlatform("org.apereo.cas:cas-server-support-bom:${project.'cas.version'}") ????????implementation platform(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES) ???????? ????*/ ????implementation "org.apereo.cas:cas-server-support-heimdall"} |
CAS 配置目錄中提供了以下設置和屬性:
必填
筆記
下面列出的配置設置在 CAS 配置元數據中標記為 Required。此標志表示可能需要該設置的存在才能激活或影響 CAS 功能的行為,并且通常應進行審查、可能擁有和調整。如果為該設置分配了默認值,則無需嚴格將該設置放在配置副本中,但仍應對其進行檢查以確保它符合您的部署預期。
Show??entries
搜索:
·??cas.heimdall.json.location= 在 CAS 能夠自動監視底層資源的更改并動態檢測更新和修改的情況和場景中,您可以將以下設置指定為環境變量或系統屬性,其值為?false,以禁用資源觀察程序:org.apereo.cas.util.io.PathWatcherService。 ?org.apereo.cas.configuration.model.SpringResourceProperties. 如何配置此屬性? |
顯示 1 到 1 的 1 個條目
上一頁1下一頁
-
-
-
- 授權請求
-
-
授權請求是一個簡單的負載,它使用終端節點?/heimdall/authorize?通過?POST?發送到 Heimdall 授權引擎。有效負載具有以下結構:
1 2 3 4 5 6 7 8 | { ??"method" : "POST", ??"uri" : "/api/example?hello=world", ??"namespace" : "API_EXAMPLE", ??"context" : { ????"key" : "value" ??}} |
…它試圖詢問 CAS:
是否允許使用 HTTP 方法?POST?對?API_EXAMPLE?擁有的?/api/example?hello=world?的請求?
支持以下元素:
田 | 描述 |
method | 請求的 HTTP 方法以允許或拒絕。 |
uri | 供調用方訪問和調用的請求 URI。 |
namespace | 相關 API 或資源的所有者的邏輯名稱。 |
context | 自由格式的鍵值對,用于基于任意上下文數據的更高級決策。 |
典型響應包括?200、401?或?403。
-
-
-
- 授權委托人
-
-
授權請求應使用?Bearer?或?Basic?方案 (Authorization: Bearer/Basic ...) 提供?Authorization?標頭。標頭中的令牌必須指示要使用請求中指定的詳細信息訪問資源的人員、使用者或授權委托人。
authorization 標頭值可以是以下值之一:
- 一個 OpenID Connect?ID 令牌,作為Bearer名令牌傳遞,由 CAS 在充當?OpenID Connect 提供商時生成。
- 一個 JWT 訪問令牌,作為Bearer名令牌傳遞,由 CAS 在充當?OAuth?或?OpenID Connect?身份提供者時生成。
- 不透明的訪問令牌(即?AT-1-...),作為Bearer記名令牌傳遞,由 CAS 在充當?OAuth?或?OpenID Connect?身份提供商時生成。
- 一個有效的 Base64 編碼的?username:password,作為?Basic?令牌傳遞,可被 CAS 身份驗證引擎接受。
提取所有令牌類型的聲明或屬性并將其附加到最終委托人,然后將其傳遞給授權策略引擎以做出決策。
-
-
-
- 授權資源
-
-
Heimdall 支持和保護的可授權資源和 API 應在 CAS 中注冊。這是通過平面 JSON 文件定義和配置資源及其關聯所有者的列表來完成的。為了便于發現,文件按 API 所有者或組(即?API_EXAMPLE.json)進行命名和分類,這些 API 所有者或組描述了該命名空間中的 API 集合:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | { ??"@class": "org.apereo.cas.heimdall.authorizer.resource.AuthorizableResources", ??"resources": [ ????"java.util.ArrayList", ????[ ??????{ ????????"@class": "org.apereo.cas.heimdall.authorizer.resource.AuthorizableResource", ????????"id": 1, ????????"pattern": "/api/example.*", ????????"method": "PUT", ????????"enforceAllPolicies": false, ????????"policies": [ "java.util.ArrayList", [ ????????????{} ????????]], ????????"properties" : { ????????????"@class" : "java.util.HashMap", ????????????"key" : "value" ????????} ??????} ????] ??], ??"namespace": "API_EXAMPLE"} |
請注意,策略的加載、排序和評估是按照它們在文件中定義的順序進行的。如果您的策略對模式進行操作,則可能需要確保首先列出最具體的策略。
?用法
請記住,文件名大多無關緊要。雖然我們建議使用合理的命名約定,但策略中的?namespace?字段實際上是確定其所有者的部分。
指定命名空間和資源擁有的授權策略支持以下元素:
田 | 描述 |
id | 此資源的唯一數字標識符。 |
pattern | 描述資源或 API 終端節點的 URI 正則表達式模式。 |
method | 允許訪問資源的 HTTP 方法(作為正則表達式模式,或?*?表示所有)。 |
policies | 附加到資源以允許或拒絕訪問的策略列表。 |
enforceAllPolicies | 是否必須查閱所有策略才能授權請求。默認值為?false。 |
properties | 附加到資源的任意鍵值對,用于高級決策。 |
-
-
-
-
- 自定義
-
-
-
您還可以構建自己的存儲庫實現來注冊和加載可授權資源。這可以通過提供?AuthorizableResourceRepository的專用實現并將其注冊到運行時來完成:
1 2 3 4 | @Beanpublic AuthorizableResourceRepository authorizableResourceRepository( ????return new MyResourceRepository();} |
請參閱本指南,了解有關如何將配置注冊到 CAS 運行時的更多信息。
-
-
-
- 授權策略
-
-
策略是附加到資源以允許或拒絕訪問的規則。每個可授權資源都可以分配有一個或多個策略。策略按照為資源定義策略的順序進行評估。CAS 支持以下策略:
Groovy
GROUPER 組
組權限
必需屬性
被拒絕的屬性
必需的 ACR
所需的 AMR
所需受眾
必需的頒發者
必需的范圍
REST API
OPENFGA
一個授權策略,可以接受內聯或外部?Groovy 腳本來做出決策:
1 2 3 4 5 6 7 8 9 10 11 12 | { ??"@class": "org.apereo.cas.heimdall.authorizer.resource.policy.GroovyAuthorizationPolicy", ??"script" : ????''' ??????groovy { ??????????def iAllowThis = true ??????????return iAllowThis ????????????? AuthorizationResult.granted("OK") ????????????: AuthorizationResult.denied("NOPE") ??????} ????'''} |
以下參數將傳遞給腳本:
參數 | 描述 |
resource | 匹配的?AuthorizableResource?對象。 |
request | 提供的?AuthorizationRequest?對象。 |
applicationContext | 對 Spring?ApplicationContext?引用的引用。 |
logger | 負責發出日志消息的對象,例如?logger.info(...) |
-
-
-
- 執行器端點
-
-
CAS 提供以下端點:
? GET | /cas/actuator/heimdall/resources? |
獲取所有可授權資源。
? GET | /cas/actuator/heimdall/resources/{namespace}? |
? GET | /cas/actuator/heimdall/resources/{namespace}/{id}? |
? POST | /cas/actuator/heimdall/resource? |
OpenFGA?是一種快速、靈活的細粒度授權系統,旨在實現大規模的可靠性和低延遲。它由 Okta/Auth0 設計、構建和贊助。
此訪問策略構建授權請求并將其提交到 OpenFGA 的check?API 終端節點。授權請求的細節使用訪問策略本身中通常定義的設置傳授給 CAS:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | { ??"@class" : "org.apereo.cas.services.CasRegisteredService", ??"serviceId" : "^https://.+", ??"name" : "test", ??"id" : 1, ??"accessStrategy" : { ????"@class": "org.apereo.cas.services.OpenFGARegisteredServiceAccessStrategy", ????"apiUrl": "http://localhost:8080", ????"object": "my-document", ????"relation": "owner", ????"storeId": "Y75hgyt75mhp", ????"token": "92d4a401-86b4-4636-b742-a7c8034756a0" ??}} |
以下字段可用于此訪問策略:
田 | 目的 |
relation | [1] 授權元組中的訪問關系或類型;默認為?owner。 |
object | [1] 授權元組的對象;如果未定義,則默認為服務 URL。 |
storeId | [1] 授權存儲標識符。 |
apiUrl | [1] OpenFGA 端點 URL。 |
token | [1] 如果需要,要在?Authorization?標頭中使用的不記名令牌。 |
Cerbos?是一種與語言無關的開放核心可擴展授權解決方案,通過為應用程序資源編寫上下文感知訪問控制策略,使用戶權限和授權易于實施和管理。
此訪問策略構建授權請求并將其提交到 Cerbos 的?check/resources?API 端點。有關授權請求的要點:
資源 ID 分配給 CAS 注冊服務的數字標識符。
所有 principal 屬性都打包并包含在授權請求中。
授權請求中包含有關 CAS 注冊服務的以下詳細信息:
serviceUrl:應用程序 URL。
serviceName:已注冊的服務名稱。
serviceId:已注冊的服務 ID。
serviceFriendlyName:已注冊的服務友好名稱。
serviceType:已注冊的服務類型。
授權請求的細節使用通常在訪問策略本身中定義的設置教給 CAS:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | { ??"@class" : "org.apereo.cas.services.CasRegisteredService", ??"serviceId" : "^https://.+", ??"name" : "test", ??"id" : 1, ??"accessStrategy" : { ????"@class": "org.apereo.cas.services.CerbosRegisteredServiceAccessStrategy", ????"apiUrl": "http://localhost:3592", ????"token": "...", ????"scope": "scope1", ????"requestId": "...", ????"rolesAttribute": "memberOf", ????"kind": "kind1", ????"actions": [ "java.util.ArrayList", [ "read", "write", "view"] ], ????"auxData": { ????????"@class": "java.util.HashMap" ????????"jwt": { ????????????"@class": "java.util.HashMap", ????????????"token": "...", ????????????"keySetId": "..." ????????} ????} ??}} |
以下字段可用于此訪問策略:
田 | 目的 |
apiUrl | [1] Cerbos 端點 URL 默認為?http://localhost:3592。 |
token | [1] 如果需要,要在?Authorization?標頭中使用的不記名令牌。 |
requestId | [1] 請求 ID 可以是唯一標識請求的任何內容。 |
kind | [1] 資源類型。必填。此值用于確定要評估的資源策略。 |
scope | [1] 資源范圍。自選。 |
rolesAttribute | [1] 屬性名稱,默認為?memberOf,表示分配給 CAS 主體的角色列表。 |
actions | 對資源執行的操作列表。 |
auxData | 自選。用于提供輔助數據的 block。有關更多信息,請參閱?Cerbos。 |
Permit.io?以服務形式提供權限,使開發人員能夠快速將權限和訪問控制融入到應用程序中。它提供了一個集中式控制面板、SDK、API 和微服務,開發人員需要添加這些微服務來創建決策和執行點。
此訪問策略嘗試將用戶與 Permit.io 同步,然后構建授權請求并將其提交給 Permit.io。授權請求的細節使用訪問策略本身中通常定義的設置傳授給 CAS:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | { ??"@class" : "org.apereo.cas.services.CasRegisteredService", ??"serviceId" : "^https://.+", ??"name" : "test", ??"id" : 1, ??"accessStrategy" : { ????"@class": "org.apereo.cas.services.PermitRegisteredServiceAccessStrategy", ????"action": "...", ????"resource": "...", ????"apiKey": "...", ????"tenant": "default", ????"pdpAddress": "https://cloudpdp.api.permit.io", ????"emailAttributeName": "email", ????"firstNameAttributeName": "firstname", ????"lastNameAttributeName": "lastname", ????"context" : { ??????"@class" : "java.util.TreeMap", ??????"param1" : "value1" ????} ??}} |
以下字段可用于此訪問策略:
田 | 目的 |
apiKey | [1] Permit.io API SDK 密鑰,允許 SDK 進行身份驗證、同步帳戶等。 |
action | 需要執行或評估的操作或權限。 |
resource | 正在請求訪問的資源。 |
tenant | 自選。租戶 ID 或密鑰在 Permit.io 中定義,并在您可能擁有多個租戶的情況下使用。 |
pdpAddress | [1] 可選。Permit.io API 終端節點。 |
emailAttributeName | 自選。同步賬戶時用于標識委托人電子郵件的屬性名稱。 |
firstNameAttributeName | 自選。在同步賬戶時用于標識委托人名字的屬性名稱。 |
lastNameAttributeName | 自選。同步賬戶時用于標識委托人的姓氏的屬性名稱。 |
Open Policy Agent?是一個開源的通用策略引擎,可在整個堆棧中實現統一、精細和上下文感知的策略實施。策略以高級聲明性語言表示,具有給定的上下文,可促進安全、高性能、精細的控制。
此訪問策略構建授權請求并通過?POST?將其提交給 OPA。授權請求的細節使用訪問策略本身中通常定義的設置傳授給 CAS:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | { ??"@class" : "org.apereo.cas.services.CasRegisteredService", ??"serviceId" : "^https://.+.example.org", ??"name" : "test", ??"id" : 1, ??"accessStrategy" : { ????"@class": "org.apereo.cas.services.OpenPolicyAgentRegisteredServiceAccessStrategy", ????"apiUrl": "http://localhost:8080", ????"decision": "example/authz/allow", ????"token": "92d4a401q26o0", ????"context" : { ??????"@class" : "java.util.TreeMap", ??????"param1" : "value1" ????} ??}} |
以下字段可用于此訪問策略:
田 | 目的 |
apiUrl | [1] OPA 端點 URL。 |
decision | 在 OPA 中定義的策略決策的名稱。 |
token | [1] 如果需要,要在?Authorization?標頭中使用的不記名令牌。 |
context | 自定義上下文,用于攜帶數據以協助策略決策。 |
[1] 此字段支持?Spring 表達式語言語法。
input?參數下的授權請求正文與以下結構匹配:
1 2 3 4 5 6 7 8 9 10 | { ??"input": { ????"principal": "casuser", ????"service": "https://myapp.example.com", ????"attributes": { ??????"email": ["user@example.org"] ????}, ????"context": { "parameter1": "value1" } ??}} |
如果策略評估成功,OPA 將返回 HTTP?200?響應代碼。非 HTTP?200?響應代碼指示配置或運行時錯誤。策略決策結果包含在響應消息正文的?result?key 中:
1 2 3 | { ??"result": true} |
Amazon Verified Permissions?是一種可擴展的權限管理和細粒度授權服務,適用于您構建的應用程序。
此訪問策略會構建授權請求并將其提交給 Amazon Verified Permissions。授權請求的細節使用訪問策略本身中通常定義的設置傳授給 CAS:
1 2 3 4 5 6 7 8 9 10 11 12 | { ??"@class": "org.apereo.cas.aws.authz.AmazonVerifiedPermissionsRegisteredServiceAccessStrategy", ??"credentialAccessKey": "...", ??"credentialSecretKey": "...", ??"region": "us-east-1", ??"policyStoreId": "...", ??"actionId": "read", ??"context": { ????"@class": "java.util.LinkedHashMap", ????"key": "value" ??}} |
以下字段可用于此訪問策略:
田 | 目的 |
credentialAccessKey | [1](可選)用于驗證請求的訪問密鑰。 |
credentialSecretKey | [1](可選)用于驗證請求的密鑰。 |
region | [1](可選)用于授權 API 請求的 AWS 區域。 |
policyStoreId | [1](可選)此策略存儲中用于使用授權的策略 |
context | (可選)用于精細授權決策的其他上下文。 |
actionId | [1] 指定要授權的請求操作。 |
[1] 此字段支持?Spring 表達式語言語法。
-
-
-
- 自定義
- 自定義無密碼身份驗證令牌
- 自定義
-
-
您還可以使用以下 bean 定義并通過實現?PasswordlessTokenRepository?來定義自己的令牌 Management 存儲:
1 2 3 4 | @Beanpublic PasswordlessTokenRepository passwordlessTokenRepository() { ????...} |
請參閱本指南,了解有關如何將配置注冊到 CAS 運行時的更多信息。