【问题标题】:shiro pac4j cas ajax 401 when accessing another clientshiro pac4j cas ajax 401 访问另一个客户端时
【发布时间】:2021-01-05 23:54:10
【问题描述】:

我正在使用 cas 5.x。

我有cas-server 和两个网络应用程序client-1client-2

目前,我可以单点登录和单点注销,但以下步骤存在一个问题:

  1. 访问client-1,它会要求我登录cas服务器,登录成功后将我重定向回client-1

  2. client-1的页面中单击一个按钮通过ajax访问client-2的受保护资源,但是这个ajax调用返回401

如果我直接在step 2的浏览器地址栏中访问client-2的受保护资源,它可以工作。

ajax 无法处理重定向导致这个问题,如何解决这个问题?

我的 ajax 调用是:

//test() is in client-1
function test() {
            
    jQuery.ajax({
        url:"http://192.168.0.14:8445/client-2/user/userInfo",
        headers: {'X-Requested-With': 'XMLHttpRequest'},        
        success: function(res) {                    
            //...
        }        
    });
        
}

【问题讨论】:

  • 你能举一个你做的ajax调用的例子吗?同时提供准确的错误信息。
  • @leopal 请查看帖子底部以查看我的 ajax 调用,并且没有错误消息,只是说 401 用于此 ajax 调用。谢谢!

标签: single-sign-on cas shiro pac4j


【解决方案1】:

根据 pac4j 文档,

当您使用间接客户端时,如果用户尝试访问受保护的 URL,请求将被重定向到身份提供者进行登录。但是,如果传入的 HTTP 请求是 AJAX 请求,则不会执行重定向并返回 401 错误页面。

所以你看到的是预期的行为。

接下来,如果X-Requested-With 标头的值为XMLHttpRequestis_ajax_request 参数或标头为true,则HTTP 请求被认为是AJAX 请求。这是处理/检测 AJAX 请求时的默认行为/条件,默认情况下,pac4j 只会计算重定向 URL 并将其添加为标头(假设间接客户端的 addRedirectionUrlAsHeader 设置为 true) 401 http状态。

ajax 无法处理重定向导致此问题

它不是为处理重定向而设计的。您需要在 AJAX 调用中捕获 401,从传递给您的标头中获取重定向 url 并自动执行重定向,或者执行任何其他对您的应用程序行为正确的活动/操作(显示消息、重定向到另一个 URL 等)。

【讨论】:

  • 我在ajax调用中捕获了401,响应头是https://localhost:8443/cas/login?service=http://192.168.0.14/client-2/callback?client_name=pac4j2Client,我手动调用这个头url然后调用原始url,仍然得到401。
  • 感谢您的回答,我会根据您所说的尝试找到解决方案。
猜你喜欢
  • 2020-03-02
  • 2020-07-08
  • 2014-08-01
  • 2022-06-18
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多