单点简单来说就是不手动登录平台就能拿到token从而访问平台内部页面。最终其实都是要调用平台的单点接口来获取token
前台单点
前台单点其实是在前台页面做开发相关改动,不需要手输账号密码,点击链接,然后前台会发送前台单点请求到后台服务器,从而获取token。其实前台单点请求还是要携带账号以及密码到后台的,只不过账号和密码一般是在前台代码里固定写好,点击的时候直接发送,单点请求也可以直接在浏览器上访问

我们提供的单点方式是ajax单点和iframe单点两种,这两种对后台来说其实没什么区别,都是调用的相同接口,主要是前台的数据响应、处理方式不同
后台单点
后台单点就是调用后台的单点接口来获取token,我们官方提供实现的就是后台单点插件,后台单点插件本质上就是通过过滤器拦截请求再调用后台单点接口生成token,让请求能携带token从而通过登录校验
我们调用这个方法基本就只需要传用户名就行,不需要密码,后台检测到相关用户存在finedb就会生成token返回
后台单点插件有两种方式,最简单的就是url上直接携带fine_username参数,然后后台单点插件的过滤器就可以直接调用后台单点接口;
另一种常用的就是给url上的用户名加密,加密后的值称为ssoToken,加密是在客户侧完成,由客户参考我们的示例代码调用RSA加密用户名,而公钥和密码都是在后台生成,然后公钥在前台系统管理处展示提供给客户。
客户自己写代码将用户名加密成ssoToken后传到后台,由插件调用单点接口,然后重定向把ssoToken隐藏掉,之前就正常单点访问平台了。
CAS单点
cas单点是第三方cas服务器进行的单点,cas服务器一般是作为认证中心,和cas做了集成的系统一般都要先登录cas才能访问,也是走过滤器拦截的方式,它和后台单点的一个区别就是:使用后台单点访问平台如果单点失败是返回到平台登录页,而cas单点如果单点访问平台失败则是会进入cas登录,因为cas基本会拦截平台所有请求。
目前提供的cas单点方式有两种:
- xml原生方式:这种是配置web.xml,里面引用cas相关jar包里提供的CasFilter,以及我们提供的FrFilter。在cas登录之后,单机情况下会把用户存入session,然后我们在FrFilter中从session获取用户名和token校验,都通过的话就直接放行请求,否则调用后台单点接口或者直接报错;

但是在集群场景下这种就不太适用了,因为集群下不同节点session不一致,所以我们定制了jar包,重写了CasFilter和FrFilter,会在cas登录之后存储了临时票据ticket→用户名这样的键值对到状态服务器上,并将ticket写入到cookie中,然后请求到FrFilter后可以根据ticket从状态服务器中获取用户名,调用后台单点接口,然后再维护一个状态服务器,存储ticket→token,用于检测token是否有效。


- 单点插件方式:插件是我们推荐进行cas单点方式,可以在系统管理中配置cas:
原理和上面基本类似,统一将用户信息存储在状态服务器,当然主要的filter就不再是CasFilter和FrFilter了,而是AuthenticationFilter和AbstractTicketValidationFilter,以及完全自定义的一些filter了
。依然首先被cas拦截,在cas登录后会生成ticket并存储临时票据ticket→用户名到状态服务器上,然后调用后台单点接口,后续登录携带了cas的ticket和平台的token就可以直接访问平台了。
插件中我们根据需要做了不少适配处理:放行移动端请求、放行某些第三方比如微信钉钉登录的请求,对不需要登录就能访问的模板或者资源文件等也放行。客户可能还有其它方面的放行需求,所以也提供了二开接口,有需要可以让客户二开插件