【FR与单点登录】单点登录失败排查

楼主
分享常见解决方案,仅供个人参考使用!
一、单点原理
登录状态是指请求中携带了token,这个token可能在请求头Authorization中



也可能在cookie中


所以完成单点登录只需要想办法让浏览器在请求自己工程的时候带上token就好了,而对于单点请求,一般都是将token(fine_auth_token)放在cookie中的,也有放在session中的,两者的区别可以自行百度。
常见的单点方式分为两种:

1)前台单点接口:http://localhost:8080/webroot/decision/login/cross/domain?fine_username=XX&fine_password=XX&validity=-2&callback=
2)后台单点接口:com.fr.decision.webservice.v10.login.LoginService#login(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.String)

二、排查步骤说明
1、首先确认是否单点成功
前台单点:直接访问前台单点请求看是否成功




后台单点:看请求中是否有Set-Cookie,如果有一般都是正常的


如果前台单点或后台单点请求都正常,但是依然单点有问题,可能是环境存在问题

2、浏览器问题
如何判断是不是浏览器的问题呢?换个浏览器(内核不同)测试下单点效果,如果换个浏览器单点可以了,说明是浏览器的问题。
注:测试单点的时候,最好是清除缓存后再进行操作,避免缓存影响导致判断出现错误。

举例:新版谷歌有samsite的问题,且新版的edge也用了谷歌内核



补充一下,如何判断cookie是否为httponly呢?一般登录成功后就会将登录信息存入cookie,这时打开浏览器的控制器就能看到,如图。



直接强制从cookie中读取所有token,在finedb的fine_conf_entity表中添加字段FSConfig.loginConfig.tokenFromCookie ServerConfig.tokenFromCookie(具体见下图对应jar包时间),值设置为true,重启工程即可。

不同jar包版本(2021年为例)的操作方案:





3、工程设置
a)安全防护
1)如果使用跨域 iframe 的方式嵌入报表,出现无法访问的情况,请关闭 Security Headers 高级设置中的「点击劫持攻击防护」按钮。
2)单点登录时若报跨域的问题,请关闭 Security Headers 高级设置中的「内容嗅探攻击防护」按钮。

b)用户异常

1)平台用户被禁用如果平台用户被禁用了,会导致前台单点不能正常登录,但后台单点不受影响。
2)用户名密码错误这个问题多见于OA集成,即系统用户名需与平台用户名保持一致,且平台用户要处于正常状态(能登录,未被禁用),出问题时可以在代码中加些调试,把结果alert出来,便于判断)

注:如果用户被禁用,只会影响前台单点不能正常登录,后台单点是不受影响的,只要数据库里有这个用户,后台照样能单点成功。

补充:如果说单点登陆的是用户A,实际显示的是用户B之类的问题,这个时候就可以拿到用户的token(获取方法见原理部分),去https://jwt.io/这个网站解析一下,就可以看到token里的用户信息,来确认说的是不是对的。





c) 9.0 session过期
1)现象:访问一段时间出现单点登录页面
2)处理思路:
1.区分概念:报表session与应用session报表session存放的是访问报表的相关信息,如访问的是不是同一个模板等,应用的session存放的是request请求等一些共享信息,两者是完全独立,不是一个概念
2.出现单点登录页面,说明应用登录session失效(或者理解为过期),9.0是根据tomcat的session超时判断的(未开启心跳场景下)
知识点:报表开启心跳设置,访问报表和fs平台时会一直触发请求,从而一直更新tomcat session时间,session永不超时




3.回到用户场景,用户在登录自己系统时同步单点到fr,再未访问报表场景下,单点会在30min失效,因此需要调整tomcat 超时时间设置tomcat session 超时设置方式:
在conf/web.xml中
<session-config>   
<session-timeout>30</session-timeout>  
</session-config>  


这里是以分钟为单位的,默认是30min,按照用户需求,可以将这边修改大一些,比如12H;注:10.0已设置seesion超时时长30min

4、代码问题

在排除了上述问题之后,我们可能就需要去检查一下代码了。

a)前台单点以ajax跨域单点为例,http://localhost:8080/webroot/decision/login/cross/domain?fine_username=XX&fine_password=XX&validity=-2&callback=
首先需要去检查地址有没有误,包括:
  • https错写成http,反之亦然
  • 工程名webroot未修改成实际的工程名
  • 网络不通(请求被拦截、ip、端口写错,决策平台安全限制等等)
可以直接在浏览器访问单点地址,看下返回值,确认下有没有问题。


b)后台单点
以cas单点为例,一般可能出问题的是web.xml,因为需要修改成实际的地址,对照着文档一步步检查设置就行。

1)cas集群
因为集群状态下session无法保持,如果在集群环境下使用了单机的cas 方案,可能会导致单点失败。
原因:前端携带的sessionid会因为集群负载均衡的原因一直变动,比如client1 向会话中写入user信息,表明单点成功,这个时候的sessionid假设为sessionId1,但是下个请求可能会请求到client2,这个时候client2根据sessionid1拿不到session,他就会生成一个新的session,同时将你的sessionId变为sessionId2,然后下个请求可能又到client1,就这样一直循环...
方案https://help.fanruan.com/finereport/doc-view-2867.html


在自己并不清楚的情况下,如何快速判断当前使用的cas集群方案或是单机方案呢?
可以根据登录之后的cookie中是否存在cas_login_ticket来判断,存在则说明是集群下的cas方案,否则是单机。



2)cas登出cas

server会发出一个下线请求,工程中cas相关的filter会拦截判断是不是登出请求,是的话则与sessionlistener 配合清除会话中的token相关信息,对于用本地生成的证书和域名,jdk是无法解析和信任的,所以请求无法发出,需要将客户端的的证书导入服务器使用的jdk。

5、特殊情况

还有一些不太常规的单点失败的问题,比如特殊的环境等等,如:

1)oa登录页跳转过快导致单点请求取消
现象:用户在自己的OA系统的登录的同时调用单点登录请求,然后页面跳转到用户OA的主页(也可能是其他页面,涉及到到页面跳转),再去访问平台发现还是会跳转到登录页。
原因:请求都是异步的,在执行单点的同时进行OA的登录操作然后跳转页面,有些浏览器会中断全部的请求导致无法写cookie。
方案:在单点登录这个请求结束之后再执行OA系统的登录操作

2)工程间session冲突
几个工程用的同一个域名,而在同一个tomcat下部署的工程 sessionid 和path默认都是一样的,所以如果同时出现写操作,工程间会出现覆盖的现象:即同一个Tomcat启动的放在webapps目录下且使用默认配置的两个工程,A操作会话可能会影响B工程,通过虚拟目录的方式单独设置下cookieSessionPath,使两个工程的session独立即可。





编辑于 2021-6-23 14:54  
分享扩散:

沙发
发表于 2021-6-23 18:02:17

回帖奖励 +20

可以,很全了
板凳
发表于 2021-6-25 10:19:04

回帖奖励 +20

地板
发表于 2021-6-25 14:35:32

回帖奖励 +20

5楼
发表于 2021-6-25 15:13:53

回帖奖励 +20

6楼
发表于 2021-7-5 18:07:16

回帖奖励 +20

7楼
发表于 2021-8-3 16:29:21

回帖奖励 +20

8楼
发表于 2021-8-4 08:20:50

回帖奖励 +20

9楼
发表于 2021-8-4 15:24:46

回帖奖励 +20

10楼
发表于 2021-8-4 18:00:48

回帖奖励 +20

很详细哦,很有帮助
11楼
发表于 2021-8-5 09:17:39

回帖奖励 +20

向老司机致敬!
12楼
发表于 2022-7-20 17:17:14
跳到casserver认证成功了,下一步应该是client端拿着sever返回的ticket换取用户信息,结果ticket接收接口200,但是白屏没有返回信息
13楼
发表于 2022-7-21 16:46:18
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

返回顶部 返回列表