一個開箱即用的高效認證鑑權框架,專一於restful api的認證鑑權動態保護

寫在開頭

看了看這個專欄的最近一篇文章已是兩年前了,時間過得好快。應該是出學校後時間就很快了。兩年前由於用shiro後,本身就按着想法開始作一個認證鑑權框架 - sureness,想它是針對restful api的,它是易用的,它是沒有框架綁定的。就按着這些想法斷斷續續的寫了兩年,中間陸陸續續在maven庫發了10個版本,線上環境的驗證。開始在這個專欄寫起來,但願有人關注和使用sureness - https://su.usthe.com前端

sureness - 面向restful api的認證鑑權

A simple and efficient open-source jvm security framework that focus on the protection of restful api.

若主頁usthe.com/sureness 訪問不了,請使用備用網站: su.usthe.comjava

Background

如今不少網站都進行了先後端分離,後端提供rest api,前端調用接口獲取數據渲染。這種架構下如何保護好後端所提供的rest api使得更加劇視。 api的保護能夠認爲:認證-請求攜帶的認證信息是否校驗經過,鑑權-認證經過的用戶擁有指定api的權限才能訪問此api。然而不只於此,什麼樣的認證策略, jwt, basic,digest,oauth仍是多支持, 權限配置是寫死代碼仍是動態配置,我想動態賦權怎麼辦,雲原生愈來愈火用的框架是quarkus等新秀不是spring生態咋弄,http實現不是servlet而是jax-rs規範咋整, to be or not to be, this is a question.git

目前 java主流的權限框架有 shiro,spring security, 下面對於它們的探討都是我的之見,接受糾正
shiro對於 restful api原生支持不太友好,須要改寫一些代碼,2年前一個項目 booshiro 就是改造 shiro,使其在過濾鏈就能匹配不一樣的 rest請求進行權限校驗,以後給 shiro commit幾回 pr, fix其在過濾鏈匹配時的危險漏洞,總的來講 shiro很強大但其起源並不是面向 web,對 restful不是很友好
spring security很強大,與 spring深度集成,離開 spring,好比 javalin和以前用過的 osgi框架 karaf就用不了了
若是不用註解配置,它們都會在鏈式匹配這塊,用請求的url和配置的鏈一個一個 ant匹配(匹配過程當中會有緩存等提升性能),但匹配的鏈過多時仍是比較耗性能(根據算法時間複雜度判斷,暫未測試驗證)
咱們但願能解決這些,提供一個 針對restful api無框架依賴,能夠 動態修改權限多認證策略更快速度易用的認證鑑權框架

Introduction

sureness 是咱們在使用 java 權限框架 shiro 以後,吸收其良好設計加上一些想法實現的全新認證鑑權項目
面對 restful api 的認證鑑權,基於 rbac (用戶-角色-資源)主要關注於對 restful api 的安全保護
無特定框架依賴(本質就是過濾器處攔截判斷,已有springboot,quarkus,javalin,ktor等demo)
支持動態修改權限配置(動態修改哪些api須要被認證,能夠被誰訪問)
支持主流http容器 servlet 和 jax-rs
支持多種認證策略, jwt, basic auth ... 可擴展自定義支持的認證方式
基於改進的字典匹配樹擁有的高性能
良好的擴展接口, demo和文檔
sureness的低配置,易擴展,不耦合其餘框架,能使開發者對本身的項目多場景快速安全的進行保護
Framework Sample Support

快速開始

使用前一些約定
  • sureness儘可能簡潔,基於rbac,只有(角色-資源)的映射,沒有(權限)動做映射,即 用戶-角色-資源
  • 咱們將restful api請求視做一個資源,資源格式爲: requestUri===httpMethod 即請求的路徑加上其請求方式(post,get,put,delete...) 做爲一個總體被視做一個資源 eg: /api/v2/book===get get方式請求/api/v2/book接口數據
  • 角色資源映射: 用戶所屬角色--角色擁有資源--用戶擁有資源(用戶就能訪問此api)
項目中加入sureness
  1. 項目使用maven構建,加入maven座標
<dependency>
 <groupId>com.usthe.sureness</groupId> 
 <artifactId>sureness-core</artifactId>   
 <version>0.1</version>
</dependency>
  1. 項目使用gradle構建,gradle座標
compile group: 'com.usthe.sureness', name: 'sureness-core', version: '0.1'
  1. 項目爲普通工程,加入sureness-core.jar依賴
在 mvnrepository 下載jar https://mvnrepository.com/artifact/com.usthe.sureness/sureness-core
添加攔截全部請求的過濾器入口

入口攔截器器實現通常能夠是 filter or spring interceptor 在攔截器加入sureness的安全過濾器,以下:
入口,通常放在攔截全部請求的filter:github

SurenessSecurityManager.getInstance().checkIn(servletRequest)
實現相關異常處理

sureness使用異常處理流程,咱們須要對checkIn拋出的異常作自定義處理,
安全過濾器,認證鑑權成功直接經過,失敗拋出特定異常,捕獲異常,以下:web

try { 
     SubjectSum subject = SurenessSecurityManager.getInstance().checkIn(servletRequest); } catch (ProcessorNotFoundException | UnknownAccountException | UnsupportedSubjectException e4) { 
     // 帳戶建立相關異常 
 } catch (DisabledAccountException | ExcessiveAttemptsException e2 ) {
    // 帳戶禁用相關異常
 } catch (IncorrectCredentialsException | ExpiredCredentialsException e3) {     // 認證失敗相關異常
 } catch (UnauthorizedException e5) { 
    // 鑑權失敗相關異常
 } catch (RuntimeException e) { 
   // 其餘自定義異常
 }
加載配置數據

sureness認證鑑權,固然也須要咱們配置本身的配置數據 - 帳戶數據,角色權限數據等 這些配置數據可能來自文本,關係數據庫,非關係數據庫 咱們提供了配置數據接口SurenessAccountProvider, PathTreeProvider, 用戶能夠實現此接口實現自定義配置數據源 當前咱們也提供默認文本形式的配置數據實現 DocumentResourceDefaultProvider, 用戶能夠配置sureness.yml來配置數據 默認文本數據源sureness.yml配置詳見文檔 默認數據源
咱們提供了使用代碼DEMO: 默認文本數據源具體實現,請參考使用sureness10分鐘搭建權限項目--sample-bootstrap
若權限配置數據來自數據庫,請參考使用sureness30分鐘搭建權限項目--sample-tom 算法

HAVE FUN spring

很是歡迎參與項目使用和貢獻,幫助sureness走得更遠更好。對項目代碼有疑問或者建議請直接聯繫 @tomsun28數據庫

相關文章
相關標籤/搜索