看了看這個專欄的最近一篇文章已是兩年前了,時間過得好快。應該是出學校後時間就很快了。兩年前由於用shiro後,本身就按着想法開始作一個認證鑑權框架 - sureness,想它是針對restful api的,它是易用的,它是沒有框架綁定的。就按着這些想法斷斷續續的寫了兩年,中間陸陸續續在maven庫發了10個版本,線上環境的驗證。開始在這個專欄寫起來,但願有人關注和使用sureness - https://su.usthe.com前端
A simple and efficient open-source jvm security framework that focus on the protection of restful api.
若主頁usthe.com/sureness 訪問不了,請使用備用網站: su.usthe.comjava
如今不少網站都進行了先後端分離,後端提供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, 無框架依賴,能夠 動態修改權限, 多認證策略, 更快速度, 易用的認證鑑權框架
sureness
是咱們在使用java
權限框架shiro
以後,吸收其良好設計加上一些想法實現的全新認證鑑權項目
面對restful api
的認證鑑權,基於rbac
(用戶-角色-資源)主要關注於對restful api
的安全保護
無特定框架依賴(本質就是過濾器處攔截判斷,已有springboot,quarkus,javalin,ktor等demo)
支持動態修改權限配置(動態修改哪些api須要被認證,能夠被誰訪問)
支持主流http容器 servlet 和 jax-rs
支持多種認證策略,jwt, basic auth
... 可擴展自定義支持的認證方式
基於改進的字典匹配樹擁有的高性能
良好的擴展接口, demo和文檔
sureness
的低配置,易擴展,不耦合其餘框架,能使開發者對本身的項目多場景快速安全的進行保護
sureness
儘可能簡潔,基於rbac
,只有(角色-資源)的映射,沒有(權限)動做映射,即 用戶-角色-資源restful api
請求視做一個資源,資源格式爲: requestUri===httpMethod
即請求的路徑加上其請求方式(post,get,put,delete...
) 做爲一個總體被視做一個資源 eg: /api/v2/book===get
get
方式請求/api/v2/book
接口數據api
)maven
構建,加入maven
座標<dependency> <groupId>com.usthe.sureness</groupId> <artifactId>sureness-core</artifactId> <version>0.1</version> </dependency>
gradle
構建,gradle
座標compile group: 'com.usthe.sureness', name: 'sureness-core', version: '0.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數據庫