访问另一个客户端时,shiro pac4j cas ajax 401

问题描述

我正在使用cas 5.x。

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

当前,我可以单点登录和单点退出,但是以下步骤存在一个问题:

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

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

如果我直接从client-2的浏览器地址栏中访问step 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) {                    
            //...
        }        
    });
        
}

解决方法

根据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等)。