jeesite自定义ckfinder2.x以实现动态权限控制

之前重做项目中遇到,之前忙没功夫整理,现在补充下记录,为了简单起见,只点出思路跟关键点。

需求:在项目管理里某些模块是有文件上传功能的,而且还要跟项目权限,以及审批流程结合起来,以达到,某些人只有授权后才能查看指定文件夹内容,某个项目的某个模块在项目在流程的某些阶段是不能上传东西的。

以前系统里是自己写的模块,我打算拿jeesite自带的ckfinder来实现,项目里带的是2.3,理论上2.6都支持。但是在网上搜了很多资料,都只是简单应用,不能实现

首先观察默认结构,前台是一个ckfinder.html,里面收集了一些地址栏参数,合并到配置里,并创建了实例。观察了下参数,没什么想要的。 ckfinder.xml:配置文件,其中types是载入的文件夹。CKFinderConfig 这是重点,配置文件里接受的配置只是默认配置,是不可变的,一旦载入后就没用了。要想动态修改权限,只能在这个类里做权限控制,那么如何从前台传入合适的参数呢。直接加在ckfiner.html后显然是不行的,根据web.xml里的配置可知,必须传给配置专用的servlet里才行,这个操作显然是由ckfinder的js自己完成的,于是去查官方文档,可以看到

 

按照文档的方式,把项目id与模块id在地址栏拼好,传入后台,在config里初始化权限前做好相关判断即可。

那么如何只显示指定type呢,可以看到基类里有types变量,正是与配置文件里相对应,而且是protected类型,子类只要重新覆盖即可。经过试验,仅覆盖types这个map还不够,会报错,还必须同时修改好typeOrder。

另外关于baseURL 跟baseDir,因为资料比较多,在此不赘述了。

最终效果如图:其中ckfinder是内嵌的iframe,审批等功能在外面的jsp实现。

==================

4.28再补充下关于路径的问题,之前没提,但是我设计的时候考虑到了,按照jeesite原有设计,是写了一个UserfilesDoloadServlet,我因为要做项目的,目录是隔离的,所以仿照他的样子写了一个一样的东西,但是发现这些预览都是不经控制的,也就是说拿到地址可以直接访问。不登录的用户当然猜不到地址,但是如果登录的用户是可以根据文件名跟模块名,项目ID,猜到其他项目文件真实访问地址的,最近在看的图解HTTP中也提到这种,叫强制浏览bug(Force browsing),我的解决办法是在项目路径后加一个随机字符串,使得其他项目的文件无法通过路径猜测浏览。当然也有更严厉的方法,但是感觉在这个项目里没有必要。

猜你喜欢

转载自my.oschina.net/u/2351812/blog/1797559
今日推荐