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

Posted

技术标签:

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

我正在使用 cas 5.x。

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

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

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

    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 调用。谢谢! 【参考方案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。 感谢您的回答,我会根据您所说的尝试找到解决方案。

以上是关于shiro pac4j cas ajax 401 访问另一个客户端时的主要内容,如果未能解决你的问题,请参考以下文章

cas单点登录-jdbc认证

cas restful接口实现SSO

SpringMvc 下集成shiro与cas

CAS登录后回传除了ticket参数以外的其他自定义参数

shiro cas 重定向循环 怎么解决的 哥们?

cas4.2.7与shiro进行整合