CAS单点登录(第7版)14.服务与应用
- 创业
- 0

如有疑问,请看视频:CAS单点登录(第7版) 服务与应用 概述 服务管理
CAS 服务管理工具允许 CAS 服务器管理员声明和配置哪些服务(CAS 客户端)可以以何种方式使用 CAS。服务管理工具的核心组件是服务注册表,它存储一个或多个已注册的服务,其中包含驱动许多 CAS 行为的元数据。
CAS 配置目录中提供了以下设置和属性:
自选
笔记
下面列出的配置设置在 CAS 配置元数据中标记为 Optional(可选)。This标志表示在最终用户 CAS 配置中不需要立即存在该设置,因为分配了默认值,或者该功能的激活不受设置值有条件地控制。换句话说,仅当需要修改默认值或需要打开由设置控制的功能时,才应在配置中包含此字段。
Show entries
搜索:
· cas.service-registry.core.index-services=true
当设置为 true 时,CAS 会为已注册服务的特定预选字段创建内存中索引,从而允许它按其友好名称、客户端 ID 等查找服务定义。这对于 OAuth 或 OpenID Connect 中的查询操作特别有用,因为无需遍历所有服务定义来查找匹配的客户端 ID。索引允许 CAS 对加载的服务对象执行直接查询,以查找相关定义。
org.apereo.cas.configuration.model.core.services.ServiceRegistryCoreProperties.
如何配置此属性?
· cas.service-registry.core.init-default-services=true
指示是否应将默认随 CAS 附带的服务定义包含在初始化过程中并导入到 CAS 服务注册表中的标志。CAS 附带的默认服务文件位于 JsonServiceRegistryProperties#DEFAULT_LOCATION_DIRECTORY 目录内的 Classpath 中。
org.apereo.cas.configuration.model.core.services.ServiceRegistryCoreProperties.
如何配置此属性?
· cas.service-registry.core.init-from-json=false
您还可以通过 #isInitDefaultServices() 控制是否应包含和初始化 default 服务。
org.apereo.cas.configuration.model.core.services.ServiceRegistryCoreProperties.
如何配置此属性?
显示 1 到 3 个条目中的 3 个
上一页1下一页
执行器端点CAS 提供以下端点:
DELETE
/cas/actuator/registeredServices/{id}
按 ID 删除已注册的服务。
GET
/cas/actuator/registeredServices/{id}
GET
/cas/actuator/registeredServices/type/{type}
GET
/cas/actuator/registeredServices
GET
/cas/actuator/registeredServices/export/{id}
GET
/cas/actuator/registeredServices/export
POST
/cas/actuator/registeredServices/import
POST
/cas/actuator/registeredServices
PUT
/cas/actuator/registeredServices
POST
/cas/actuator/serviceAccess
注册服务已注册的服务会显示以下元数据:
字段
描述
id
必需的唯一标识符。此值必须是有效的数值。
name
必需名称(255 个字符或更少)。
description
服务的可选自由文本描述。(255 个字符)
informationUrl
指向服务信息指南的可选自由文本链接。
privacyUrl
指向服务隐私政策的可选自由文本链接。
redirectUrl
将身份验证响应返回给应用程序时使用的可选 URL。
logo
作为此服务的徽标的图像文件的可选路径。该图像将与服务描述和名称一起显示在登录页面上。该值可以是 CAS Web 应用程序 images 目录的相对路径,也可以是完整的 URL。
serviceId
描述逻辑服务的必需正则表达式。逻辑服务定义一个或多个服务所在的一个或多个 URL。url 模式的定义必须仔细完成,因为它可能会打开安全漏洞。
locale
可选的区域设置名称,可用于在服务请求票证时自定义 CAS UI。值可以使用 Spring 表达式语言语法。有关更多详细信息,请参阅本指南。
theme
可选主题名称,可用于在服务请求票证时自定义 CAS UI。值可以使用 Spring 表达式语言语法。有关更多详细信息,请参阅本指南。
proxyPolicy
确定服务是否能够代理身份验证。有关更多信息,请参阅本指南。
evaluationOrder
确定已注册服务的评估的相对顺序。当两个服务 URL 表达式涵盖相同的服务时,此标志尤其重要;评估顺序 确定首先评估哪个注册,并充当内部排序因子。
authenticationPolicy
用作全局身份验证引擎的补充或覆盖的身份验证策略。有关更多详细信息,请参阅本指南。
attributeReleasePolicy
描述属性集的策略允许发布到应用程序,以及清除一些属性所需的任何其他过滤逻辑。有关属性发布和过滤器的更多详细信息,请参阅本指南。
logoutType
定义在启动注销协议后应如何处理此服务。可接受的值为 LogoutType.BACK_CHANNEL、LogoutType.FRONT_CHANNEL 或 LogoutType.NONE。有关注销的更多详细信息,请参阅本指南。
responseType
定义 CAS 应如何响应对此服务的请求。有关更多详细信息,请参阅本指南。
usernameAttributeProvider
提供程序配置,它指示应将 “username” 的值发送回应用程序。有关属性发布和过滤器的更多详细信息,请参阅本指南。
accessStrategy
概述和访问此服务的规则的策略配置。它描述了是否允许服务、是否授权参与 SSO,或者是否可以根据特定属性定义的角色(即 RBAC)从 CAS 角度授予访问权限。有关属性发布和过滤器的更多详细信息,请参阅本指南。
publicKey
与此服务关联的公钥,用于通过加密 CAS 验证协议响应中的某些元素和属性(如 PGT 或凭证)来授权请求。有关属性发布和过滤器的更多详细信息,请参阅本指南。
logoutUrl
此服务接收注销请求的 URL 端点。有关更多详细信息,请参阅本指南
properties
以键/值对的形式与此服务关联的额外元数据。这用于将自定义字段注入服务定义中,以便扩展模块稍后使用该字段来定义每个服务的其他行为。有关更多信息,请参阅本指南。
multifactorPolicy
描述此服务身份验证 (通常用于多因素身份验证) 所需配置的策略。
contacts
指定与拥有应用程序的服务关联的联系人集合。有关更多信息,请参阅本指南。
matchingStrategy
指定用于将服务定义与身份验证请求匹配的策略。有关更多信息,请参阅本指南。
supportedProtocols
指定此服务支持和允许的协议。有关更多信息,请参阅本指南。
templateName
在构建此服务定义时,要用作蓝图的模板服务定义的名称。
服务类型
请注意,虽然上述属性适用于所有通用服务定义,但 CAS 中还有其他服务类型可能被激活和需要,具体取决于所使用的协议和客户端应用程序的性质。请务必查看您心目中的功能的专用指南(即 OAuth、SAML 等)。
存储以下选项可用于在 CAS 中存储服务。
存储
描述
用法
Memory
请参阅本指南。
将存储在内存中的服务定义 XML 存储。更改需要重新打包 CAS 并重新启动服务器
JSON 格式
请参阅本指南。
将服务定义存储在平面 JSON 文件中。HA 部署需要复制服务定义。
YAML
请参阅本指南。
与 JSON 相同。
GIT
请参阅本指南。
将服务定义存储在 Git 存储库中。HA 部署的候选项。
MongoDb 数据库
请参阅本指南。
将服务定义存储在 MongoDb 中。HA 部署的候选项。
Redis
请参阅本指南。
将服务定义存储在 Redis 中。HA 部署的候选项。
LDAP 协议
请参阅本指南。
将服务定义存储在目录服务器中。HA 部署的候选项。
JPA
请参阅本指南。
将服务定义存储在关系数据库(Oracle、MySQL 等)中。HA 部署的候选项。
DynamoDb
请参阅本指南。
在 DynamoDb 中存储服务定义。HA 部署的候选项。
亚马逊 S3
请参阅本指南。
将服务定义存储在 Amazon S3 存储桶中。HA 部署的候选项。
CosmosDb 数据库
请参阅本指南。
将服务定义存储在 Azure CosmosDb 中。HA 部署的候选项。
Cassandra
请参阅本指南。
将服务定义存储在 Apache Cassandra 中。HA 部署的候选项。
REST
请参阅本指南。
将您自己的服务注册表实现设计为 REST API。HA 部署的候选项。
自定义
请参阅本指南。
使用 CAS API 作为扩展设计您自己的服务注册表。HA 部署的候选项。
我该如何选择?菜单上有各种各样的服务注册表。选择标准概述如下:
选择您最熟悉的技术,并具备排除故障、调整和扩展的技能和耐心,以取得成功。
选择一种不会强制将 CAS 配置绑定到集群中任何单个服务器/节点的技术,因为这将带来自动扩展问题和手动操作。选择一种与您的网络和防火墙配置配合良好且性能足够高且可靠的技术,具体取决于您的网络拓扑。选择一种在预期负载下显示有希望的结果的技术,并运行性能和压力测试。选择一种尽可能不依赖外部流程、系统和人工工作、自力更生且自给自足的技术。 缓存和重新加载 服务管理 - 缓存从服务注册表加载的 CAS 服务定义使用expire-after-write过期策略进行缓存。此类定义将自动过期并从缓存中删除,除非使用显式重新加载操作强制删除。特别是,您需要确保缓存过期策略和期限不会与重新加载操作和计划冲突。例如,配置错误可能会导致缓存可能为空,而计划程序则延迟运行几分钟/秒。如果缓存为空,则来自应用程序的身份验证请求可能不会立即获得授权util 已调度加载程序有机会重新填充和重建缓存。
CAS 配置目录中提供了以下设置和属性:
自选
笔记
下面列出的配置设置在 CAS 配置元数据中标记为 Optional(可选)。This标志表示在最终用户 CAS 配置中不需要立即存在该设置,因为分配了默认值,或者该功能的激活不受设置值有条件地控制。换句话说,仅当需要修改默认值或需要打开由设置控制的功能时,才应在配置中包含此字段。
Show entries
搜索:
· cas.service-registry.cache.cache-size=10000
此缓存大小指定缓存可以包含的最大条目数。请注意,缓存可能会在超过此限制之前逐出条目,或者在逐出时暂时超过阈值。当缓存大小增长到接近最大值时,缓存会移出不太可能再次使用的条目。例如,缓存可能会逐出某个条目,因为它最近没有使用或非常频繁地使用。请注意: 要禁用缓存,您可以选择缓存大小 0。
org.apereo.cas.configuration.model.core.cache.ExpiringSimpleCacheProperties.
如何配置此属性?
· cas.service-registry.cache.duration=PT15M
缓存持续时间 指定条目在创建后自动从缓存中删除的固定持续时间。
此设置支持java.time.Duration 语法 [?]。
org.apereo.cas.configuration.model.core.cache.ExpiringSimpleCacheProperties.
如何配置此属性?
· cas.service-registry.cache.initial-capacity=1000
此缓存容量设置内部数据结构的最小总大小。在构造时提供足够大的估计值可以避免以后进行昂贵的大小调整操作,但将此值设置得不必要地高会浪费内存。
org.apereo.cas.configuration.model.core.cache.ExpiringSimpleCacheProperties.
如何配置此属性?
显示 1 到 3 个条目中的 3 个
上一页1下一页
服务管理 - 重新加载可以将 CAS 配置为按计划从连接的源和服务注册表加载服务定义。服务定义作为后台运行的作业加载,并且该操作会强制 CAS 刷新服务定义的缓存版本并使之失效,然后重新开始。
CAS 配置目录中提供了以下设置和属性:
自选
笔记
下面列出的配置设置在 CAS 配置元数据中标记为 Optional(可选)。This标志表示在最终用户 CAS 配置中不需要立即存在该设置,因为分配了默认值,或者该功能的激活不受设置值有条件地控制。换句话说,仅当需要修改默认值或需要打开由设置控制的功能时,才应在配置中包含此字段。
Show entries
搜索:
· cas.service-registry.schedule.cron-expression=
一个类似 cron 的表达式,扩展了通常的 UN*X 定义,以包括秒、分钟、小时、月日、月和星期几的触发器。例如,0 * * * * MON-FRI 表示工作日每分钟一次(在分钟的顶部 - 第 0 秒),或 0 0 0 * * * 表示每天午夜。* 请注意,定义 cron 表达式时,必须删除 start delay 和 repeat interval 设置并将其设置为空白。
org.apereo.cas.configuration.model.support.quartz.SchedulingProperties.
如何配置此属性?
· cas.service-registry.schedule.cron-time-zone=
将解析 cron 表达式的时区。默认情况下,此属性为空(即将使用调度程序的时区)。
org.apereo.cas.configuration.model.support.quartz.SchedulingProperties.
如何配置此属性?
· cas.service-registry.schedule.enabled-on-host=.*
如果此属性与 CAS 服务器的主机名不匹配,则覆盖 SchedulingProperties#enabled 属性值 true。如果在 statefulset 中部署带有镜像的 CAS,其中所有名称都是可预测的,但很难为不同的服务器使用不同的配置,那么这可能很有用。该值可以是确切的主机名,也可以是将用于匹配主机名的正则表达式。
此设置支持正则表达式模式。[?].
org.apereo.cas.configuration.model.support.quartz.SchedulingProperties.
如何配置此属性?
· cas.service-registry.schedule.enabled=true
是否应启用计划程序来计划作业运行。
org.apereo.cas.configuration.model.support.quartz.SchedulingProperties.
如何配置此属性?
· cas.service-registry.schedule.repeat-interval=PT2M
为数据存储实施重新加载数据的重复间隔的字符串表示形式。这是连续任务执行之间的超时。
此设置支持java.time.Duration 语法 [?]。
org.apereo.cas.configuration.model.support.quartz.SchedulingProperties.
如何配置此属性?
显示 1 到 5 的 6 个条目
上一页12下一页
访问策略 概述 配置服务访问策略已注册服务的访问策略提供对服务授权规则的精细控制。它描述了是否允许服务使用 CAS 服务器、是否允许参与单点登录身份验证等。此外,它可以配置为需要一组特定的主体属性,这些属性必须存在,然后才能授予对服务的访问权限。此行为允许根据应用程序的访问角色配置各种属性,并定义在来自应用程序的身份验证请求到达时将制定和验证的规则。
策略
资源
基本
请参阅本指南。
未经授权的 URL
请参阅本指南。
ABAC
请参阅本指南。
Groovy
请参阅本指南。
基于时间
请参阅本指南。
(远程)HTTP 请求
请参阅本指南。
Grouper
请参阅本指南。
AWS 验证权限
请参阅本指南。
OpenFGA
请参阅本指南。
Cerbos
请参阅本指南。
Open Policy 代理
请参阅本指南。
链接
请参阅本指南。
自定义
请参阅本指南。
执行器端点CAS 提供以下端点:
POST
/cas/actuator/serviceAccess
验证是否可以向用户授予服务访问权限。
基本 服务访问策略 - 基本默认策略允许使用以下属性配置服务:
田
描述
enabled
用于切换条目是否处于活动状态的标志;禁用的条目产生的行为相当于不存在的条目。
ssoEnabled
设置为 false 可强制用户对服务进行身份验证,而不管协议标志如何(例如 renew=true)。
不允许使用 CAS 的服务:
1
2
3
4
5
6
7
8
9
10
{
"@class" : "org.apereo.cas.services.CasRegisteredService",
"serviceId" : "testId",
"name" : "testId",
"id" : 1,
"accessStrategy" : {
"@class" : "org.apereo.cas.services.DefaultRegisteredServiceAccessStrategy",
"enabled" : false
}}
不允许服务使用 CAS 进行单点登录,并且每次都会提示用户输入凭据:
1
2
3
4
5
6
7
8
9
10
{
"@class" : "org.apereo.cas.services.CasRegisteredService",
"serviceId" : "testId",
"name" : "testId",
"id" : 1,
"accessStrategy" : {
"@class" : "org.apereo.cas.services.DefaultRegisteredServiceAccessStrategy",
"ssoEnabled" : false
}}
ABAC 服务访问策略 - ABAC基于属性的访问控制 (ABAC) 是一种授权模型,它评估主体/用户属性而不是角色来确定访问权限。使用 ABAC,访问策略根据访问请求中涉及的经过身份验证的主体/委托人、资源、操作和环境的属性来实施访问决策。委托人是请求访问资源以执行操作的用户。用户配置文件中的主体属性包括 ID、作业角色、组成员身份、部门和组织成员身份、管理级别、安全许可和其他识别标准。
用法
请注意,主体/必需属性名称的比较区分大小写。任何单个属性名称都需要完全匹配。此外,请注意,如果 CAS 服务器配置为在发布时缓存属性,则还必须将所有必需的属性发布给依赖方。有关属性发布和过滤器的更多信息,请参阅本指南。
ABAC 策略允许配置具有以下属性的服务:
田
描述
requiredAttributes
所需的主体属性名称以及每个属性的值集的 Map。这些属性必须对经过身份验证的 Principal 可用,并在 CAS 继续之前解析,从而从 CAS 的角度为基于角色的访问控制提供选项。如果未显示必需的属性,则将完全忽略该检查。
requireAllAttributes
用于切换以控制所需属性的行为的标志。默认值为 true,这意味着必须存在所有必需的属性名称。否则,至少一个匹配的属性名称可能就足够了。请注意,此标志仅控制必须存在的属性名称以及属性名称的数量。如果属性名称满足 CAS 配置,则在下一步中,至少需要一个匹配的属性值才能成功进行访问策略。
caseInsensitive
指示是否应以不区分大小写的方式对 required 属性值进行匹配。默认值为 false
rejectedAttributes
被拒绝的主体属性名称的 Map 以及每个属性的值集。这些属性不得对经过身份验证的 Principal 可用,以便可以授予访问权限。如果未定义,则完全忽略检查。
您还可以优化 ABAC 策略以有条件地激活和实施策略。有关更多信息,请参阅本指南。
必需属性
可选属性
组合条件
Groovy
被拒绝的属性
使用所需主体属性名称的 Map 以及每个属性的值集来控制访问。
支持的语法
给定属性的必需值支持正则表达式模式。例如,phone属性可能需要 \d\d\d-\d\d\d-\d\d\d\d 的值模式。
要访问该服务,主体必须具有值为 admin 的 cn 属性和值为 Administrator 的givenName 属性:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"@class" : "org.apereo.cas.services.CasRegisteredService",
"serviceId" : "testId",
"name" : "testId",
"id" : 1,
"accessStrategy" : {
"@class" : "org.apereo.cas.services.DefaultRegisteredServiceAccessStrategy",
"enabled" : true,
"ssoEnabled" : true,
"requiredAttributes" : {
"@class" : "java.util.HashMap",
"cn" : [ "java.util.HashSet", [ "admin" ] ],
"givenName" : [ "java.util.HashSet", [ "Administrator" ] ]
}
}}
激活 服务访问策略 - ABAC 激活标准可以修改 ABAC 策略以有条件地激活访问策略策略,然后,如果确定策略保持非活动状态,则可以选择决定最终访问策略结果。
您可以使用以下策略实施条件。
属性
Groovy
链接
可以根据可用的 principal 属性有条件地激活策略。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
"@class" : "org.apereo.cas.services.CasRegisteredService",
"serviceId" : "https://app.example.org",
"name" : "Example",
"accessStrategy" : {
"@class" : "org.apereo.cas.services.DefaultRegisteredServiceAccessStrategy",
"requiredAttributes" : {
"@class" : "java.util.HashMap",
"cn" : [ "java.util.HashSet", [ "admin" ] ]
},
"activationCriteria": {
"@class": "org.apereo.cas.services.AttributeBasedRegisteredServiceAccessStrategyActivationCriteria",
"allowIfInactive": false,
"operator": "AND",
"requiredAttributes": {
"@class" : "java.util.HashMap",
"firstName": [ "java.util.ArrayList", [ "John", "Jon" ] ],
"lastName": [ "java.util.ArrayList", [ "Holdoor", "Hodor" ] ]
}
}
}}
在上面的示例中,仅当当前委托人具有值为 Jon 或 John 的 lastName 属性,并且具有值为 Holdoor 或 Hodor 的 firstName 属性时,才会激活访问策略。还可以将 operator 字段修改为使用 OR
请注意,如果访问策略无法激活并且必须保持非活动状态,则会通过 allowIfInactive 拒绝访问。
链接 服务访问策略 - 链接多个访问策略可以组合在一起,形成一个链中的复杂规则和条件。使用链,可以实现高级布尔逻辑将结果分组在一起。请注意,链也可以包含其他链。
如果经过身份验证的委托人
具有值为 value1 的属性 key1 和值为 value2 的属性 key2。
…或者......
具有值为 value3 的属性 key3。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
{
"@class" : "org.apereo.cas.services.CasRegisteredService",
"serviceId" : "^https://.+",
"name" : "test",
"id" : 1,
"accessStrategy" : {
"@class": "org.apereo.cas.services.ChainingRegisteredServiceAccessStrategy",
"strategies": [ "java.util.ArrayList",
[ {
"@class": "org.apereo.cas.services.ChainingRegisteredServiceAccessStrategy",
"strategies": [ "java.util.ArrayList",
[
{
"@class": "org.apereo.cas.services.DefaultRegisteredServiceAccessStrategy",
"requiredAttributes": {
"@class": "java.util.LinkedHashMap",
"key1": [ "java.util.LinkedHashSet", [ "value1" ] ]
}
},
{
"@class": "org.apereo.cas.services.DefaultRegisteredServiceAccessStrategy",
"requiredAttributes": {
"@class": "java.util.LinkedHashMap",
"key2": [ "java.util.LinkedHashSet", [ "value2" ] ]
}
}
]
],
"operator": "AND"
},
{
"@class": "org.apereo.cas.services.DefaultRegisteredServiceAccessStrategy",
"requiredAttributes": {
"@class": "java.util.LinkedHashMap",
"key3": [ "java.util.LinkedHashSet", [ "value3" ] ]
}
}
]
],
"operator": "OR"
}}
Groovy 服务访问策略 - Groovy所有服务和应用程序都可以使用 Groovy 脚本来执行访问策略和授权决策。此策略不与特定应用程序绑定,而是针对所有服务和集成调用。
要准备 CAS 以支持 Apache Groovy 并与之集成,请查看本指南。
CAS 配置目录中提供了以下设置和属性:
必填
Groovy 脚本
笔记
下面列出的配置设置在 CAS 配置元数据中标记为 Required。此标志表示可能需要该设置的存在才能激活或影响 CAS 功能的行为,并且通常应进行审查、可能拥有和调整。如果为该设置分配了默认值,则无需严格将该设置放在配置副本中,但仍应对其进行检查以确保它符合您的部署预期。
Show entries
搜索:
· cas.access-strategy.groovy.location=
在 CAS 能够自动监视底层资源的更改并动态检测更新和修改的情况和场景中,您可以将以下设置指定为环境变量或系统属性,其值为 false,以禁用资源观察程序:org.apereo.cas.util.io.PathWatcherService。
org.apereo.cas.configuration.model.SpringResourceProperties.
如何配置此属性?
显示 1 到 1 的 1 个条目
上一页1下一页
脚本的大纲如下:
1
2
3
4
5
6
7
8
9
10
import org.apereo.cas.audit.*import org.apereo.cas.services.*
def run(Object[] args) {
def (context,logger) = args
logger.debug("Checking access for ${context.registeredService}")
def result = AuditableExecutionResult.builder().build()
result.setException(UnauthorizedServiceException.denied("Service unauthorized"))
return result}
以下参数将传递给脚本:
参数
描述
context
一个 AuditableContext 对象,用于传输可审计的数据,例如已注册的服务、身份验证等。
logger
负责发出日志消息的对象,例如 logger.info(...)
Groovy Per Service此策略委托给 Groovy 脚本,以动态决定 CAS 在运行时针对特定服务定义请求的访问规则:
1
2
3
4
5
6
7
8
9
{
"@class" : "org.apereo.cas.services.CasRegisteredService",
"serviceId" : "^https://.+",
"id" : 1,
"accessStrategy" : {
"@class" : "org.apereo.cas.services.GroovyRegisteredServiceAccessStrategy",
"groovyScript" : "file:///etc/cas/config/access-strategy.groovy"
}}
此组件的配置有资格使用 Spring 表达式语言语法。请参阅 CAS API 文档以了解有关操作和预期行为的更多信息。
脚本本身可以通过在必要时覆盖所需的操作来设计:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import org.apereo.cas.services.*import org.apereo.cas.authentication.principal.*
def isServiceAccessAllowed(RegisteredService registeredService, Service service) {
registeredService != null}
def isServiceAccessAllowedForSso(RegisteredService registeredService) {
registeredService != null}
def authorizeRequest(RegisteredServiceAccessStrategyRequest request) {
request.service != null}
所有操作都被视为可选操作,如果在脚本中未定义,则操作的最终结果将被视为 false,并且访问被拒绝。
要准备 CAS 以支持 Apache Groovy 并与之集成,请查看本指南。
Grouper 服务访问策略 - Grouper通过在 WAR 覆盖中包含以下依赖项来启用 grouper 访问策略:
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-grouper-core"}
此访问策略尝试查找 CAS 委托人的 Grouper 组。Grouper 返回的组作为 CAS 属性收集,并根据服务访问所需的属性列表进行检查。
以下属性可用:
田
描述
值
groupField
将 Grouper 组转换为 CAS 属性时 Grouper 组的属性。
NAME、EXTENSION、DISPLAY_NAME DISPLAY_EXTENSION。
您还需要确保 grouper.client.properties 在 Classpath (即 src/main/resources) 上可用,并具有以下配置的属性:
1
2
3
grouperClient.webService.url = http://grouper.example.com/grouper-ws/servicesRestgrouperClient.webService.login = bandersongrouperClient.webService.password = password
基于组的显示扩展的 Grouper 访问策略:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"@class" : "org.apereo.cas.services.CasRegisteredService",
"serviceId" : "^https://.+",
"name" : "test",
"id" : 1,
"accessStrategy" : {
"@class" : "org.apereo.cas.grouper.services.GrouperRegisteredServiceAccessStrategy",
"requireAllAttributes" : true,
"requiredAttributes" : {
"@class" : "java.util.HashMap",
"grouperAttributes" : [ "java.util.HashSet", [ "faculty" ] ]
},
"groupField" : "DISPLAY_EXTENSION"
}}
虽然 grouper.client.properties 是一个硬性要求并且必须提供,但配置属性始终可以分配给 strategy以覆盖默认值:
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.grouper.services.GrouperRegisteredServiceAccessStrategy",
"configProperties" : {
"@class" : "java.util.HashMap",
"grouperClient.webService.url" : "http://grouper.example.com/grouper-ws/servicesRest"
},
"groupField" : "DISPLAY_EXTENSION"
}}
您还可以考虑通过修改 /src/main/resources/grouper.client.properties 来外部化 Grouper 客户端配置文件,以包含以下内容:
1
grouperClient.config.hierarchy = classpath:/grouper.client.base.properties,file:/etc/cas/config/grouper.client.properties
…其中 /etc/cas/config/grouper.client.properties 将包含实际的 Grouper 相关设置。
故障排除要启用其他日志记录,请配置 log4j 配置文件以添加以下级别:
1
2
3
4
5
6
...<Logger name="edu.internet2.middleware" level="debug" additivity="false">
<AppenderRef ref="casConsole"/>
<AppenderRef ref="casFile"/></Logger>
...
OpenFGA 服务访问策略 - OpenFGAOpenFGA 是一种快速、灵活的 Fine-Grained Authorization 系统,旨在实现大规模的可靠性和低延迟。它由 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 标头中使用的不记名令牌。
[1] 此字段支持 Spring 表达式语言语法。
Cerbos 服务访问策略 - CerbosCerbos 是一种与语言无关的开放核心可扩展授权解决方案,通过为应用程序资源编写上下文感知访问控制策略,使用户权限和授权易于实施和管理。
此访问策略构建授权请求并将其提交到 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。
[1] 此字段支持 Spring 表达式语言语法。
Permit.io 服务访问策略 - Permit.ioPermit.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
自选。同步账户时用于标识委托人的姓氏的属性名称。
[1] 此字段支持 Spring 表达式语言语法。
Open Policy 代理 服务访问策略 - 开放策略代理 (OPA)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}
AWS 验证权限 服务访问策略 - AWS Verified PermissionsAmazon 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 表达式语言语法。
HTTP 协议 服务访问策略 - HTTP 请求此策略允许配置具有以下属性的服务:
田
描述
ipAddress
(可选)正则表达式模式与客户端 IP 地址进行比较。
userAgent
(可选)正则表达式模式与浏览器用户代理的比较。
headers
(可选)正则表达式模式与请求标头进行比较。
此策略的目标是检查 HTTP 请求的特定属性,并通过将这些属性与预定义的规则和模式(例如可能基于 IP 地址、用户代理等的属性)进行比较来做出服务访问决策。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"@class" : "org.apereo.cas.services.CasRegisteredService",
"serviceId" : "^https://.+",
"id" : 1,
"accessStrategy" : {
"@class" : "org.apereo.cas.services.HttpRequestRegisteredServiceAccessStrategy",
"ipAddress" : "192.\\d\\d\\d.\\d\\d\\d.101",
"userAgent": "Chrome.+",
"headers":{
"@class": "java.util.TreeMap",
"Header1": "Value.+Pattern"
}
}}
REST 服务访问策略 - REST此策略允许配置具有以下属性的服务访问策略:
田
描述
endpointUrl
从 CAS 接收经过身份验证的委托人的授权请求的终端节点。
acceptableResponseCodes
逗号分隔的响应代码,被视为接受服务访问。
此策略的目标是确保远程终端节点可以通过接收经过 CAS 身份验证的委托人作为 GET 请求的 url 参数来做出服务访问决策。然后,将终端节点返回的响应代码与策略设置进行比较,如果找到匹配项,则授予访问权限。
以下是根据响应代码授权服务访问的远程终端节点访问策略的示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"@class" : "org.apereo.cas.services.CasRegisteredService",
"serviceId" : "^https://app.example.org",
"id" : 1,
"accessStrategy" : {
"@class" : "org.apereo.cas.services.RemoteEndpointServiceAccessStrategy",
"endpointUrl" : "https://somewhere.example.org",
"acceptableResponseCodes" : "200,202",
"method": "GET",
"headers": {
"@class":"java.util.LinkedHashMap",
"Content-Type": "application/json"
}
}}
时间 服务访问策略 - 时间基于时间的访问策略允许配置具有以下属性的服务:
田
描述
startingDateTime
指示可以授予服务访问权限的开始日期/时间。 (即 2015-10-11T09:55:16.552-07:00)
endingDateTime
指示可以授予服务访问权限的结束日期/时间。 (即 2015-10-20T09:55:16.552-07:00)
只允许在 startingDateTime 和 endingDateTime 内进行服务访问:
1
2
3
4
5
6
7
8
9
10
11
12
{
"@class" : "org.apereo.cas.services.CasRegisteredService",
"serviceId" : "^https://.+",
"name" : "test",
"id" : 62,
"accessStrategy" : {
"@class" : "org.apereo.cas.services.TimeBasedRegisteredServiceAccessStrategy",
"startingDateTime" : "2015-11-01T13:19:54.132-07:00",
"endingDateTime" : "2015-11-10T13:19:54.248-07:00",
"zoneId" : "UTC"
}}
公钥组件的配置有资格使用 Spring 表达式语言语法。
自定义 服务访问策略 - 自定义如果您希望创建自己的访问策略和授权策略执行器,则需要设计一个组件并将其注册到 CAS 以处理实施:
1
2
3
4
5
6
7
8
9
10
11
12
package org.apereo.cas;
@AutoConfiguration@EnableConfigurationProperties(CasConfigurationProperties.class)public class MyConfiguration {
@Bean
@RefreshScope(proxyMode = ScopedProxyMode.DEFAULT)
public RegisteredServiceAccessStrategyEnforcer myEnforcer() {
return new MyRegisteredServiceAccessStrategyEnforcer();
}}
请参阅本指南,了解有关如何将配置注册到 CAS 运行时的更多信息。
未授权的 URL 服务访问策略 - 未经授权的 URL默认策略允许使用以下属性配置服务:
田
描述
unauthorizedRedirectUrl
可选 url,用于在不允许服务访问时重定向流。值可以使用 Spring 表达式语言语法。
如果委托人没有包含值 super-user 的 cn 属性,则服务访问将被拒绝。如果是这样,用户将被重定向到 https://www.github.com。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"@class": "org.apereo.cas.services.CasRegisteredService",
"serviceId" : "testId",
"name" : "testId",
"id": 1,
"accessStrategy" : {
"@class" : "org.apereo.cas.services.DefaultRegisteredServiceAccessStrategy",
"unauthorizedRedirectUrl" : "https://www.github.com",
"requiredAttributes" : {
"@class" : "java.util.HashMap",
"cn" : [ "java.util.HashSet", [ "super-user" ] ]
}
}}
动态 URL如果委托人没有包含值 super-user 的 cn 属性,则服务访问将被拒绝。如果是这样,将根据指定 Groovy 脚本的结果动态确定重定向 URL。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"@class": "org.apereo.cas.services.CasRegisteredService",
"serviceId" : "testId",
"name" : "testId",
"id": 1,
"accessStrategy" : {
"@class" : "org.apereo.cas.services.DefaultRegisteredServiceAccessStrategy",
"unauthorizedRedirectUrl" : "file:/etc/cas/config/unauthz-redirect-url.groovy",
"requiredAttributes" : {
"@class" : "java.util.HashMap",
"cn" : [ "java.util.HashSet", [ "super-user" ] ]
}
}}
脚本本身可能采用以下形式:
1
2
3
4
5
6
7
8
9
10
11
12
13
标签:
CAS单点登录(第7版)14.服务与应用由讯客互联创业栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“CAS单点登录(第7版)14.服务与应用”