1. 程式人生 > >restful專案的許可權控制實現技巧

restful專案的許可權控制實現技巧

前言

最近的專案在用restful風格在寫,果然url都有了意義,功能都可以從url中推測出來,restful的url和非restful的url最大的一個感官區別就是,rest的url可能存在一些變數,比如下面這樣:/check/api/user/12345/history,這個url解釋起來就是:檢視賬號為12345的使用者的歷史資料,而非rest的url是:/check/api/user/history。那麼,現在問題就來了,許可權控制的核心是判斷url,rest的url中卻有變數,那麼,rest風格的專案如何實現許可權控制呢?

實現

其實在我我寫這篇文章之前,我的思路是把url的變數去掉,然後存許可權表中,然後判斷的時候就把訪問的url按照相同的規則處理,再在資料庫中查,如果查到了代表有許可權,反之沒有。但事實證明,這種思路只有在變數在url的結尾時才可行。

首先我貼一下許可權表的結構,這個是許可權控制的核心表。

  1. -- Create table
  2. createtable STAFF_POWER  
  3. (  
  4.   stp_id      NUMBER notnull,  
  5.   stp_name    VARCHAR2(40),  
  6.   create_time TIMESTAMP(6),  
  7.   stp_url     VARCHAR2(100),  
  8.   stp_method  VARCHAR2(10)  
  9. )  
  10. tablespace CHECK_ZS  
  11.   pctfree 10  
  12.   initrans 1  
  13.   maxtrans 255  
  14.   storage  
  15.   (  
  16.     initial 64K  
  17.     next 1M  
  18.     minextents 1  
  19.     maxextents unlimited  
  20.   );  
  21. -- Create/Recreate primary, unique and foreign key constraints 
  22. altertable STAFF_POWER  
  23.   addconstraint STP_PK primarykey (STP_ID)  
  24.   using index
  25.   tablespace CHECK_ZS  
  26.   pctfree 10  
  27.   initrans 2  
  28.   maxtrans 255  
  29.   storage  
  30.   (  
  31.     initial 64K  
  32.     next 1M  
  33.     minextents 1  
  34.     maxextents unlimited  
  35.   );  
  36. altertable STAFF_POWER  
  37.   addconstraint STP_UN unique (STP_URL, STP_METHOD)  
  38.   using index
  39.   tablespace CHECK_ZS  
  40.   pctfree 10  
  41.   initrans 2  
  42.   maxtrans 255  
  43.   storage  
  44.   (  
  45.     initial 64K  
  46.     next 1M  
  47.     minextents 1  
  48.     maxextents unlimited  
  49.   );  
每個欄位的意思我解釋一下,id是主鍵,name是這條許可權的名字,time是建立時間,由系統自動生成,url是url,method是訪問方式。

然後比較關鍵的一點就來了,url存的時候將變數全部換成%,為什麼這樣呢,先看下我判斷許可權的sql:

  1. <selectid="selectByUrlAndMethod"resultMap="BaseResultMap"parameterType="java.lang.String">
  2.     select *  
  3.     from STAFF_POWER  
  4.     <where>
  5.         and STP_METHOD = #{method}  
  6.         and #{url} like STP_URL   
  7.     </where>
  8.   </select>
我用的mybatis。

許可權攔截器的核心程式碼如下:

  1. StaffPower power=powerSer.selectByUrlAndMethod(url, method);  
  2.         if (power!=null) {  
  3.             boolean isPass=role.getPowers()!=null && (","+role.getPowers()+",").contains(","+power.getStpId()+",");  
  4.             if (isPass==false) {  
  5.                 Result<String> result=new Result<String>(BaseRestController.ERROR, Code.ROLE_NO_PERMISSION, "您沒有許可權,請聯絡管理員");  
  6.                 PrintWriter pw=resp.getWriter();  
  7.                 pw.print(gson.toJson(result));  
  8.                 pw.flush();  
  9.                 pw.close();  
  10.                 returnfalse;  
  11.             }  
  12.             return isPass;  
  13.         }else{  
  14.             log.error("沒有這個許可權   "+url+"  "+method);  
  15.             Result<String> result=new Result<String>(BaseRestController.ERROR, Code.PERMISSION_NO_EXIST, "該模組還沒有設計許可權,暫時不能操作");  
  16.             PrintWriter pw=resp.getWriter();  
  17.             pw.print(gson.toJson(result));  
  18.             pw.flush();  
  19.             pw.close();  
  20.             returnfalse;  
  21.         }  


現在資料庫中有這樣一條許可權:


我現在想看歷史,於是訪問 /check/api/sourceTp/3803140612558/history,然後sql是怎麼執行的呢,下面是執行的結果:

  1. [2017-05-1110:09:54.400] - [DEBUG] [http-nio-8080-exec-9  :17561] ==>  Preparing: select * from STAFF_POWER WHERE STP_METHOD = ? and ? like STP_URL   
  2. [2017-05-1110:09:54.400] - [DEBUG] [http-nio-8080-exec-9  :17561] ==> Parameters: GET(String), /check/api/sourceTp/3803140612558/history(String)  
  3. [2017-05-1110:09:54.403] - [DEBUG] [http-nio-8080-exec-9  :17564] <==      Total: 1

看到這裡,它的原理應該就很清楚了,許可權控制核心是url+method的判斷,而rest的url比較特別從而導致無法像原來那樣判斷,於是我把所有的變數替換為%,而%是sql模糊查詢的符號,所以就剛好可以借用sql的模糊查詢來完成判斷(中間不做任何處理)。

總結

判斷的核心是url+method,但最最核心(而且好多人都沒想到這種方法)的是使用%,%代表任意。

相關推薦

restful專案許可權控制實現技巧

前言最近的專案在用restful風格在寫,果然url都有了意義,功能都可以從url中推測出來,restful的url和非restful的url最大的一個感官區別就是,rest的url可能存在一些變數,比如下面這樣:/check/api/user/12345/history,這

Spring Cloud實戰 | 第十一篇:Spring Cloud Gateway 閘道器實現RESTful介面許可權控制和按鈕許可權控制

## 一. 前言 hi,大家好,這應該是農曆年前的關於開源專案[有來商城](https://github.com/hxrui) 的最後一篇文章了。 [有來商城](https://github.com/hxrui) 是基於 Spring Cloud OAuth2 + Spring Cloud Gateway

java專案許可權控制的理解和示例(基於shiro和傳統攔截器filter兩種方式)

1.概念 個人理解,許可權就是做到對不同使用者進行訪問限制,前提是保證在許可權需求設計範圍內不會出現非法也能訪問到不該訪問到的東西.因此按資料表設計將許可權分為:部門,使用者,角色,角色許可權中間表,許可權.(個人覺得一般專案可以考慮部門和角色合為一個),這

ERP管理系統的許可權控制實現--shiro

1 Shiro基本原理分析 Authentication:身份認證/登入,驗證使用者是不是擁有相應的身份; Authorization:授權,即許可權驗證,驗證某個已認證的使用者是否擁有某個許可權;即判斷使用者是否能做事情,常見的如:驗證某個使用者是否擁有某個角色。或者

在前後端分離的專案中,後臺使用shiro框架時,怎樣使用它的會話管理系統(session),從而實現許可權控制

在前後端分離的專案中,ajax跨域和儲存使用者資訊是其中的重點和難點。 如果在後臺使用shiro框架來進行許可權控制,就需要用到cookie+session的模式來儲存使用者的資訊。 在前一篇文章《在前後端分離的專案中,ajax跨域請求怎樣附帶cookie》中,我具體寫了怎

Redis實現Restful的訪問許可權控制(一)

redis資料來源接入 redis快取 使用者登入標識快取 訪問介面許可權攔截 redis資料來源接入 redis.properties redis.host=127.0.0.1 redis.

sharepoint2013列表實現專案許可權控制

        在sharepoint2013許可權控制中,有時候會涉及更精細化的控制,比如在列表中考慮控制列表項的許可權。         下面就舉例介紹一下如何進行設定。         例子:1、具有了一個可用的網站集                     2、新建

Redis實現Restful的訪問許可權控制(四)

redis資料來源接入 redis快取 使用者登入標識快取 訪問介面許可權攔截 訪問介面許可權攔截 @Authorization @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNT

Spring Cloud實戰 | 第十一篇:Spring Cloud Gateway閘道器實現RESTful介面許可權和按鈕許可權細粒度控制

## 一. 前言 hi,大家好,這應該是農曆年前的關於開源專案[有來商城](https://github.com/hxrui) 的最後一篇文章了。 [有來商城](https://github.com/hxrui) 是基於 Spring Cloud OAuth2 + Spring Cloud Gateway

認證鑑權與API許可權控制在微服務架構中的設計與實現

引言: 本文系《認證鑑權與API許可權控制在微服務架構中的設計與實現》系列的第一篇,本系列預計四篇文章講解微服務下的認證鑑權與API許可權控制的實現。 1. 背景 最近在做許可權相關服務的開發,在系統微服務化後,原有的單體應用是基於session的安全許可權方式,不能滿足現有的微服務架構的認

認證鑑權與API許可權控制在微服務架構中的設計與實現(四)

引言: 本文系《認證鑑權與API許可權控制在微服務架構中的設計與實現》系列的完結篇,前面三篇已經將認證鑑權與API許可權控制的流程和主要細節講解完。本文比較長,對這個系列進行收尾,主要內容包括對授權和鑑權流程之外的endpoint以及Spring Security過濾器部分踩坑的經歷。歡迎閱讀本系列

認證鑑權與API許可權控制在微服務架構中的設計與實現(三)

引言: 本文系《認證鑑權與API許可權控制在微服務架構中的設計與實現》系列的第三篇,本文重點講解token以及API級別的鑑權。本文對涉及到的大部分程式碼進行了分析,歡迎訂閱本系列文章。 1. 前文回顧 在開始講解這一篇文章之前,先對之前兩篇文章進行回憶下。在第一篇 認證鑑權與AP

Laravel 通過Gate實現使用者-角色-許可權控制

1.建立相應的資料庫: 建立許可權表: Schema::create('permissions',function(Blueprint $table){ $table->increments('id'); $table->

Spring Boot 整合 Shiro實現許可權控制,親測可用,附帶sql

前提: 本文主要講解Spring Boot 與 Shiro的整合 與許可權控制的實現方式(主要以程式碼實現功能為主),主要用到的技術Spring Boot+Shiro+Jpa(通過Maven構建),並不會涉及到Shiro框架的原始碼分析 如果有想要學習Shiro框架的小夥伴可以去http://shiro.

基於RESTful API 設計使用者許可權控制

RESTful簡述   本文是基於RESTful描述的,需要你對這個有初步的瞭解。 RESTful是什麼? Representational State Transfer,簡稱REST,是Roy Fielding博士在2000年他的博士論文中提出來的一種軟體架構風格。 REST比較

vue許可權控制選單顯示的簡單實現

為了對於不同角色顯示不同的選單 思路1: 本地放一份完整的選單資料,通過後臺返回角色的選單列表.兩者對比,篩選需要顯示的選單資料繫結, 這裡有個問題就是路由vue例項初始化就生成了,載入的全部,人為輸入地址是可以訪問到角色許可權以外的資料, 所以還要加路由構子router.befor

如何實現資料分析的許可權控制

哈哈哈哈,打不過我吧,沒有辦法我就是這麼強大,哈哈哈哈,追不上我吧,沒有辦法被我打敗啦,哈哈哈哈,看不見我吧,分析許可權根本沒在怕! 所謂資料分析的許可權控制,就是指標對不同的使用者分別配置不同的訪問規則,使他們在登入後看到的資料不一樣。有些東西不是你想看,想看就能看的,想看還得問問俺老孫答不答

潤乾報表如何實現資料許可權控制

售前現場交流或售後技術支援階段,經常被客戶問到:“你們報表系統是怎麼搞許可權控制的?” 既然經常被問,那麼今天就討論一下這個問題。 首先呢,看看許可權管理長啥樣! 許可權管理:(來自百度百科),一般指根據系統設定的安全規則或者安全策略,使用者可以訪問而且只能訪問自己被授權的資源,不多不少

SpringBoot2.0整合SpringSecurity並實現驗證碼和許可權控制

使用SpringBoot2.0 整合SpringSecurity加入kaptcha驗證碼,使用redis實現session共享,請看原始碼,附上資料庫指令碼,絕對可以跑起來,原始碼地址為 1、pom檔案 <?xml version="1.0" encoding=

手把手教你實現Java許可權管理系統 前端篇(十三):頁面許可權控制

許可權控制方案 既然是後臺許可權管理系統,當然少不了許可權控制啦,至於許可權控制,前端方面當然就是對頁面資源的訪問和操作控制啦。 前端資源許可權主要又分為兩個部分,即導航選單的檢視許可權和頁面增刪改操作按鈕的操作許可權。 我們的設計把頁面導航選單和頁面操作按鈕統一儲存在選單資料庫表中,選單表中包含以下許可權關