【问题标题】:cas delegated authenticaion: dynamic client id and secret in cas pac4jcas 委托验证:cas pac4j 中的动态客户端 ID 和秘密
【发布时间】:2020-03-02 18:36:18
【问题描述】:

我的配置如下

cas.authn.pac4j.typed-id-used=true
cas.authn.pac4j.oauth2[0].principal-attribute-id=preferred_username
cas.authn.pac4j.oauth2[0].id=xxxxxxxxxxxxxx
cas.authn.pac4j.oauth2[0].secret=xxxxxxxxxx
cas.authn.pac4j.oauth2[0].client-name=salesforce
cas.authn.pac4j.oauth2[0].auth-url=https://login.salesforce.com/services/oauth2/authorize
cas.authn.pac4j.oauth2[0].token-url=https://login.salesforce.com/services/oauth2/token
cas.authn.pac4j.oauth2[0].profile-url=https://login.salesforce.com/services/oauth2/userinfo
cas.authn.pac4j.oauth2[0].use-path-based-callback-url=false
cas.authn.pac4j.oauth2[0].profile-attrs.preferred_username=preferred_username

在登录页面中,我需要获取用户电子邮件 ID,并根据电子邮件 ID 从数据库中获取客户端 ID 和密码,然后在重定向 URL 中使用。

有可能实现吗?

【问题讨论】:

  • 请详细说明您的登录流程。你指的是哪个登录页面?CAS登录页面还是oath服务器登录页面?
  • @leopal 喜欢 CAS 欢迎页面 -> 在 CAS 登录欢迎页面中显示 Salesforce、zoho 或标准登录页面等可用客户端。用户单击 salesforce 后 -> 要求用户输入电子邮件 ID。基于电子邮件 ID 查找客户端 ID 和密码。基本上想动态传递 id 和 secret。我正在检查 cas webflow 自定义以将标准登录页面更改为自定义并且不知道 pac4j 自定义。
  • 当用户点击 salesforce 选项时,他会被重定向到外部系统,对吧?他提供了他的电子邮件,然后销售人员的回复返回给 cas。之后,cas 将经过身份验证的用户重定向到初始化登录过程的服务。那么您是否需要在初始服务中包含用户的其他属性?如果是,请检查attribute release
  • @leopal 实际上没有。如果你看到我上面的配置,我没有给出 id 和 secret。我有多个 id 和 secret,从我的客户到客户。如果在此处配置 id 和 secret,则 cas 总是重定向到具有相同 id 的 salesfore。但是这个 id 会随着客户端的变化而变化。我需要一种方法来动态传递 id 和 secret
  • 您使用的是哪个版本的 CAS? CAS 5.3? CAS 6.1?其他的?

标签: cas cas pac4j


【解决方案1】:

我需要获取用户 email-id 并根据 email id 从数据库中获取客户端 ID 和密码,然后在重定向 URL 中使用。

在 CAS 中无法修改用于委托身份验证的重定向 URL。重定向 URL 是使用 pac4j 自动构建和计算的,并且没有开箱即用的方法来动态操作该 URL。

为了适应这种情况,您不能依赖 CAS 自动为您创建 pac4j 客户端。相反,您需要手动创建自己的 pac4j 客户端。这意味着:

  • 您需要设计一个 Spring 配置类
  • 您必须创建自己的客户端并将其注入 CAS
  • 您需要使用RedirectionActionBuilder 的特殊实现来修改新建的客户端。每个客户端对象都可以访问知道如何构建重定向 URL 的 RedirectionActionBuilder。您需要自己编写才能更改重定向网址。

CAS 最终将执行此代码以进行重定向:

final View result;
final RedirectAction action = client.getRedirectAction(webContext);
if (RedirectAction.RedirectType.SUCCESS.equals(action.getType())) {
    result = new DynamicHtmlView(action.getContent());
} else {
    final URIBuilder builder = new URIBuilder(action.getLocation());
    final String url = builder.toString();
    LOGGER.debug("Redirecting client [{}] to [{}] based on identifier [{}]", client.getName(), url, ticket.getId());
    result = new RedirectView(url);
}

关键行是client.getRedirectAction(webContext);,这是使用重定向操作的地方,如果您的客户正在使用您自己的该概念实现,那么这将是确定最终 URL 的地方。

或者,您可以修改叠加层中的DelegatedClientNavigationController.java,并随意操作网址(和上述代码)。

【讨论】:

    猜你喜欢
    • 2019-03-10
    • 1970-01-01
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 2011-09-16
    相关资源
    最近更新 更多