实现类似cesium ion的token权限验证,将token写入前端header发送get请求
环境:前端vue3+element-plus+cesium,后端django+DRF(可加nginx)
需求:不同用户上传自己的数据(尤其是3D数据),然后其他人不可访问,这就涉及到权限了。如果已有系统实现了基于RBAC的用户注册登录等功能,那么只需要在这个系统上开发即可!
注意,注意,注意: Cesium.Cesium3DTileset(url:"./data/tileset.json"),url会自动把部署的ip加到url前面http://localhost/data/tileset.json,本质上这是Get请求,可以传参的,而且cesium ion应该也是get请求,那么这里的url后面可以加“?token=参数”,这样就有希望做后端的数据权限验证了。[PS: 最新好消息是cesium支持将token放到header中,这样就和web服务的请求一样了,详见下面代码]
【前端】直接在cesium中的url中后面加"?token=***",就可以了!即:Cesium.Cesium3DTileset(url: "http://ip/data/tileset.json?token=***"),这样就可以发送get请求参数了。不推荐上面这种写法,而是使用Cesium.Resource函数封装url、header、token等参数,API使用查看:https://cesium.com/learn/cesiumjs/ref-doc/Resource.html?classFilter=resource
【后端】可直接在后端新建files文件夹,然后暴露到公共url中,并且在url中正则匹配获取token,然后在对应的类函数校验即可!又或者直接暴露url,然后在view中进行token的校验,这样就不需要在url中正则匹配了,获取对应的header参数即可,更加方便,也是最正确的做法。
若使用nginx,则简单的发布数据http服务,是公共的,任何人都可访问。不符合权限校验,可以使用nginx的第三方库:ngx_http_auth_request_module模块,然后设置2个地方:针对json/JSON/glb/GLB/b3m/B3DM/gltf/GLTF,走单独的auth流程;然后auth类似反向代理,这里就跳转指向到后端的API中,然后就可以把获取得到的token进入后端进行校验。
【针对90%的普通用户-尤其是政府单位】先将nginx设置防盗链(用于请求头限制ip-即部署前端的ip,但是可以伪造ip欺骗),并同时设置反向代理;然后将这个数据url与用户对应存入数据库,这样登录系统后(其他电脑ip)访问部署的前端-后端,前端部署电脑ip是被nginx允许的,所以就可以通过系统跳转访问了。但是本质依旧没有权限限制,因为防盗链可以被欺骗。但可以让90%的用户按照操作登录系统来进行。。。因为他们不懂
对于3dtiles不管是3D矢量,倾斜摄影,一般常用的方式是nginx做静态代理http服务,因为3D的是不像2D的经常动态更新的,3D的更新是重新生成!所以nginx适合。
注意点:对于3dtiles小文件数量,如果是百万级数量,nginx是可以代理的。但是超过1000万个小文件,linux的inode吃不消,所以nginx此时也不行,那么就建议使用mongodb,采用类似文件夹的形式进行存储,然后后端python按照url读取!对于省级的数据尤其是影像切片(1-18级,一般很少全部使用)切片产生2000万,更是推荐使用MongoDB了,搜索一下学习。