CKEditor与CKFinder学习--安全的使用CKFinder与权限控制
0 前言
上一篇博客中說了ckeditor與ckfinder整合之后進行圖文混排的時候通過瀏覽服務器按鈕可以瀏覽服務器上的所有資源,文件,圖片,該用戶上傳的,非該用戶上傳的,不僅可以查看,還可以刪除、重命名等。所以不是很安全。
上一篇博客介紹了一種方法就是直接屏蔽掉瀏覽服務器的按鈕,這樣用戶就只能上傳,通過上傳后再引用。不過盡管把按鈕屏蔽了,但是鏈接的路徑依然存在。
通過訪問
http://127.0.0.1:8080/ckdemo/assets/ckfinder/ckfinder.html
用戶依然可以訪問到文件瀏覽的頁面
所以本文的第一個就是介紹如何不讓用戶訪問http://127.0.0.1:8080/ckdemo/assets/ckfinder/ckfinder.html頁面。
不讓用戶訪問上面的頁面,可以有很多種方法,可以參考之前的Shiro進行攔截,然而本文今天介紹使用SpringMVC的攔截器對其進行攔截。
1 通過攔截器阻止直接訪問
1.1 定義攔截器
實現HandlerInterceptor接口
package com.gwc.cktest.intercepter;import java.util.Enumeration;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession;import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView;public class CkfinderInterceepter implements HandlerInterceptor {private static final Log logger = LogFactory.getLog(CkfinderInterceepter.class);@Overridepublic void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)throws Exception {logger.info("==========走到了 afterCompletion() 方法");}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object obj, ModelAndView model)throws Exception {logger.info("==========走到了 postHandle() 方法");}// 返回值,表示我們是否需要將當前的請求攔截下來// 如果返回false,請求將被終止,如果為true,請求將被放行// Object arg2 表示的是被攔截的請求的目標對象@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {logger.info("==========走到了 preHandle() 方法"+"==========");logger.info("==========進行攔截==========");return false;}}1.2 配置攔截器和攔截規則
在SpringMVC的配置文件中進行攔截器的配置和攔截規則的設定
<mvc:interceptors><mvc:interceptor><!-- 攔截規則 --><mvc:mapping path="/**/ckfinder.html" /><!-- 攔截器 --><bean class="com.gwc.cktest.intercepter.CkfinderInterceepter"></bean></mvc:interceptor></mvc:interceptors>因為我們需要攔截的是
http://127.0.0.1:8080/ckdemo/assets/ckfinder/ckfinder.html
所以我們的攔截規則設置為/**/ckfinder.html
1.3 效果
沒有配置攔截器
配置攔截器之后
這種方式有點類似CSDN寫博客了,只允許上傳圖片或者引用其他在線圖片,不能瀏覽
2 細粒度的權限控制
細粒度的權限控制中,我們將不會全部攔截對http://127.0.0.1:8080/ckdemo/assets/ckfinder/ckfinder.html的請求,而是進行有條件的攔截,條件就是ckfinder權限中的角色session對應的key為CKFinder_UserRole,我們在攔截器中需要查看session中是否有有CKFinder_UserRole再決定放行與否。在用戶登錄的時候往session中寫CKFinder_UserRole。
具體流程圖如下。
先來配置資源訪問的訪問控制(ACL),這部分在ckfinder.xml中進行配置。
2.1 配置ckfinder.xml
首先閱讀一下ckfinder的開發者文檔
http://docs.cksource.com/CKFinder_2.x/Developers_Guide/Java/Configuration/Access_Control
它介紹了訪問控制,主要是通過配置accessControls來控制用戶的權限的
所有的權限都在accessControls標簽中,具體的權限被配置在一個個accessControl中
其中第一個role標簽代表的是角色,與其稱作角色不如稱為key為CKFinder_UserRole的session,在userRoleSessionVar可以配置。
你可以配置自己喜歡的session使其key為CKFinder_UserRole的value為你喜歡的任何字符串,不過最好能見名知意,*表示是所有的用戶都可以訪問。
其他標簽也很好理解resourceType表示資源類型,以folder開頭的是對文件夾的操作權限,以file開頭的是對文的操作權限。
2.1.1 權限配置
現在我們配置兩種權限,一個是admin,權限最大,什么權限都有,另一個是user權限,他只能查看根目錄下的Images資源,而且對文件夾有只讀操作和創建操作,對文件具有查看和上傳操作。
<userRoleSessionVar>CKFinder_UserRole</userRoleSessionVar><accessControls><accessControl><role>admin</role><resourceType>*</resourceType><folder>/</folder><folderView>true</folderView><folderCreate>true</folderCreate><folderRename>true</folderRename><folderDelete>true</folderDelete><fileView>true</fileView><fileUpload>true</fileUpload><fileRename>true</fileRename><fileDelete>true</fileDelete></accessControl><accessControl><role>user</role><resourceType>Images</resourceType><folder>/</folder><folderView>true</folderView><folderCreate>true</folderCreate><folderRename>false</folderRename><folderDelete>false</folderDelete><fileView>true</fileView><fileUpload>true</fileUpload><fileRename>false</fileRename><fileDelete>false</fileDelete></accessControl></accessControls>2.2 攔截器實現
將上面的攔截器進行修改,只改preHandle方法,如果session中有CKFinder_UserRole則放行,否則攔截請求。
// 返回值,表示我們是否需要將當前的請求攔截下來// 如果返回false,請求將被終止,如果為true,請求將被放行// Object arg2 表示的是被攔截的請求的目標對象@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {logger.info("==========走到了 preHandle() 方法"+"==========");HttpSession session = request.getSession();String user = (String) session.getAttribute("CKFinder_UserRole");if (StringUtils.isNotEmpty(user)) {logger.info("==========session中的CKFinder_UserRole:"+user+"==========");return true;}logger.info("==========session中沒有CKFinder_UserRole進行攔截==========");return false;}2.3 登錄時寫session
@RequestMapping(value = "/admin.html", method = RequestMethod.POST)@ResponseBodypublic String ckAdmin(HttpServletRequest request, String userId) {logger.info("==========" + userId + "登陸了" + "==========");HttpSession session=request.getSession();// 這里的邏輯很簡單,如果是admin就將session中CKFinder_UserRole設為admin,其他的設置為userif (userId.equals("admin")) {session.setAttribute("CKFinder_UserRole", "admin");} else {session.setAttribute("CKFinder_UserRole", "user");}logger.info("==========" + "session 設置成功" + "==========");return "session 設置成功";}退出時清空session
@RequestMapping(value = "/logout.html", method = RequestMethod.POST)@ResponseBodypublic String ckLogout(HttpServletRequest request) {HttpSession session = request.getSession();Enumeration<?> e = session.getAttributeNames();while (e.hasMoreElements()) {String sessionName = (String) e.nextElement();logger.info("==========存在的session有:" + sessionName + ":"+session.getAttribute(sessionName)+"==========");session.removeAttribute(sessionName);}logger.info("==========" + "session 移除成功" + "==========");return "session 移除成功";}2.4 演示
2.4.1 沒有session
當用戶沒有登錄,也就是說session中還什么都沒有的時候
用戶通過瀏覽服務器什么也干不了
http://127.0.0.1:8080/ckdemo/assets/ckfinder/ckfinder.html也是無法訪問的。
這是日志信息
2.4.2 session中CKFinder_UserRole為user
這個時候用戶只能瀏覽,上傳,不能刪除照片,重命名照片
當然,通過http://127.0.0.1:8080/ckdemo/assets/ckfinder/ckfinder.html直接訪問,用戶只能看到Images文件夾,對文件夾也只能讀和創建操作
2.4.3 session中CKFinder_UserRole為admin
這個時候用戶可以進行所有的操作
當然,通過http://127.0.0.1:8080/ckdemo/assets/ckfinder/ckfinder.html直接訪問可以看到其他的文件夾,且具有刪除操作
ckfinder的安全使用就寫到這里。
示例地址
https://github.com/peer44/ckeditor
參考文獻
http://docs.cksource.com/CKFinder_2.x/Developers_Guide/Java/Configuration/Access_Control
總結
以上是生活随笔為你收集整理的CKEditor与CKFinder学习--安全的使用CKFinder与权限控制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VUE定时器,用于登陆获取验证码倒计时
- 下一篇: 网校搭建3:安装meEdu