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-1
和client-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
标头的值为XMLHttpRequest
或is_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 访问另一个客户端时的主要内容,如果未能解决你的问题,请参考以下文章