Pac4j Scala:如何在安全动作中指定目标SAML2客户端?
问题:pac4j多SAML2Client实例如何指定具体客户端
我有一个包含两个SAML2Client的pac4j Config:
val clients = new Clients(baseUrl + "/domain/callback", samlClient1, samlClient2) val config = new Config(clients)
我的问题:当两个客户端均为SAML2Client时,如何在安全动作中指定要使用的客户端?
def SAMLSecure: SecureAction[SAML2Profile, AnyContent, AuthenticatedRequest] = Secure( clients = "SAML2Client", // 如何指定samlClient1或samlClient2 authorizers = myAuthorizers, matchers = myMatchers )
解决方案
要指定具体的SAML2Client,核心是给每个客户端实例设置唯一的名称标识,之后在Secure动作中直接引用该名称即可。
步骤1:为每个SAML2Client设置唯一名称
初始化客户端时,通过setName方法为每个SAML2Client实例分配不同的名称,避免默认名称("SAML2Client")重复:
// 为第一个SAML客户端设置唯一名称 samlClient1.setName("saml-client-1") // 为第二个SAML客户端设置唯一名称 samlClient2.setName("saml-client-2") // 后续初始化Clients和Config的逻辑不变 val clients = new Clients(baseUrl + "/domain/callback", samlClient1, samlClient2) val config = new Config(clients)
步骤2:在Secure动作中指定目标客户端名称
在定义安全动作时,将clients参数设置为对应客户端的名称即可:
// 指定使用samlClient1的安全动作 def SAMLSecureClient1: SecureAction[SAML2Profile, AnyContent, AuthenticatedRequest] = Secure( clients = "saml-client-1", authorizers = myAuthorizers, matchers = myMatchers ) // 指定使用samlClient2的安全动作 def SAMLSecureClient2: SecureAction[SAML2Profile, AnyContent, AuthenticatedRequest] = Secure( clients = "saml-client-2", authorizers = myAuthorizers, matchers = myMatchers )
原理说明
pac4j的Clients集合通过客户端的name属性区分不同实例,默认情况下所有SAML2Client的name都是"SAML2Client",导致无法精准匹配。给每个实例设置唯一名称后,就能在Secure动作中直接指定目标客户端。
内容的提问来源于stack exchange,提问作者epinal
相关产品推荐
相关产品推荐

