java鉴权_一个开箱即用的高效认证鉴权框架,专注于restful api的认证鉴权动态保护...
作者:tomsun28
來源:SegmentFault 思否
寫在開頭
看了看這個專欄的最近一篇文章已經是兩年前了,時間過得好快。應該是出學校后時間就很快了。兩年前因為用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.com
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.
目前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
- spring?sample-bootstrap
- springboot?sample-tom
- quarkus?sample-quarkus
- javalin?sample-javalin
- ktor?sample-ktor
- spring webflux?sample-spring-webflux
- more samples todo
快速開始
使用前一些約定
- sureness盡量簡潔,基于rbac,只有(角色-資源)的映射,沒有(權限)動作映射,即 用戶-角色-資源
- 我們將restful api請求視作一個資源,資源格式為:?requestUri===httpMethod?即請求的路徑加上其請求方式(post,get,put,delete...) 作為一個整體被視作一個資源?eg: /api/v2/book===get?get方式請求/api/v2/book接口數據
- 角色資源映射: 用戶所屬角色--角色擁有資源--用戶擁有資源(用戶就能訪問此api)
項目中加入sureness
- 項目使用maven構建,加入maven坐標
com.usthe.sureness sureness-core 0.1- 項目使用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:
SurenessSecurityManager.getInstance().checkIn(servletRequest)實現相關異常處理
sureness使用異常處理流程,我們需要對checkIn拋出的異常做自定義處理,
安全過濾器,認證鑒權成功直接通過,失敗拋出特定異常,捕獲異常,如下:
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
非常歡迎參與項目使用和貢獻,幫助sureness走得更遠更好。對項目代碼有疑問或者建議請直接聯系 @tomsun28
-?END -
總結
以上是生活随笔為你收集整理的java鉴权_一个开箱即用的高效认证鉴权框架,专注于restful api的认证鉴权动态保护...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果手机原装充电器多少钱?
- 下一篇: 苹果粉集合!果6好还是6P好啊?