接口開發使用的框架
jeecg本身是基於 Spring MVC 框架搭建的,因此,使用 Spring MVC 框架的 RESTful API 功能來進行接口開發就是順理成章的事了。
接口的攔截與鑒權
與對普通請求的攔截一樣,也是利用了 Spring MVC 的 Interceptor 機制來對接口的請求進行攔截,實現邏輯在 org.jeecgframework.jwt.aop.RestAuthTokenInterceptor 這個類的 preHandle( ) 方法。從代碼可以看出,用戶的身份是放在 X-AUTH-TOKEN 這個請求頭里的字符串,而事件的身份認證是采用了 JWT (JSON web token) 規范來實現的。
除了對 url 的攔截外,jeecg還實現了接口級別的權限授權管理,具體實現代碼可參考 demo 里的 com.jeecg.black.controller.TsBlackListController 這個類。在具體接口的第一行代碼,我們可以看到有調用以下方法:
org.jeecgframework.web.system.util.InterfaceUtil.getInterfaceRuleDto(HttpServletRequest request,InterfaceEnum interfaceEnum);
InterfaceEnum 類是對接口的枚舉,demo 為了演示方便,直接把所有接口放在類文件來定義了,該類主要代碼如下:
public enum InterfaceEnum { blacklist_list("blacklist_list", "黑名單列表查詢", "/rest/tsBlackListController", "GET", 1), blacklist_get("blacklist_get", "黑名單單條數據查詢", "/rest/tsBlackListController/{id}", "GET", 2), blacklist_add("blacklist_add", "黑名單添加", "/rest/tsBlackListController", "POST", 3), blacklist_edit("blacklist_edit", "黑名單編輯", "/rest/tsBlackListController", "PUT", 4), blacklist_delete("blacklist_delete", "黑名單刪除", "/rest/tsBlackListController/{id}", "DELETE", 5); /** * 接口編碼 */ private String code; /** * 接口名稱 */ private String name; /** * 接口url */ private String url; /** * 接口請求方式 */ private String method; /** * 接口排序 */ private Integer sort; private InterfaceEnum(String code, String name, String url, String method, Integer sort) { this.code = code; this.name = name; this.url = url; this.method = method; this.sort = sort; } ... }
每個接口對應一個枚舉類型,在 getInterfaceRuleDto( ) 方法里會校驗當前用戶是否被授予了該枚舉類型對應的 code 的權限。而接口權限的授予跟普通菜單的權限管理界面類似,同時也支持數據權限的設置,實現原理可參考我之前寫的關於權限相關的文章。
總結
jeecg對接口的實現原理大體與普通頁面的實現原理一致,而提供接口方式主要是為了跟第三方系統對接,可以讓第三方系統方便地調用接口操作數據。因此,jeecg框架引入了 JWT token 的方式來實現接入權限的校驗。由於接口的使用場景與普通頁面的使用場景不同,於是專門針對接口單獨做了一套權限管理邏輯,可以說是在一個管理系統里平行實現了兩套權限管理,分別針對接口和普通頁面,但實現的邏輯和流程都是類似的。
以上是對jeecg框架接口開發及權限實現原理的簡單分析,希望能對讀者在接口設計、開發及管理的思考中有一點點啟發和借鑒作用。
作者:碼語生活
鏈接:https://www.jianshu.com/p/9fb12455730b
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。