java鉴权_一个开箱即用的高效认证鉴权框架,专注于restful api的认证鉴权动态保护...
作者:tomsun28
來源:SegmentFault 思否
寫在開頭
看了看這個專欄的最近一篇文章已經(jīng)是兩年前了,時間過得好快。應(yīng)該是出學(xué)校后時間就很快了。兩年前因為用shiro后,自己就按著想法開始做一個認證鑒權(quán)框架 - sureness,想它是針對restful api的,它是易用的,它是沒有框架綁定的。就按著這些想法斷斷續(xù)續(xù)的寫了兩年,中間陸陸續(xù)續(xù)在maven庫發(fā)了10個版本,線上環(huán)境的驗證。開始在這個專欄寫起來,希望有人關(guān)注和使用sureness - https://su.usthe.com
sureness - 面向restful api的認證鑒權(quán)
A simple and efficient open-source jvm security framework that focus on the protection of restful api.
若主頁usthe.com/sureness?訪問不了,請使用備用網(wǎng)站:?su.usthe.com
Background
現(xiàn)在很多網(wǎng)站都進行了前后端分離,后端提供rest api,前端調(diào)用接口獲取數(shù)據(jù)渲染。這種架構(gòu)下如何保護好后端所提供的rest api使得更加重視。api的保護可以認為:認證-請求攜帶的認證信息是否校驗通過,鑒權(quán)-認證通過的用戶擁有指定api的權(quán)限才能訪問此api。然而不僅于此,什么樣的認證策略, jwt, basic,digest,oauth還是多支持, 權(quán)限配置是寫死代碼還是動態(tài)配置,我想動態(tài)賦權(quán)怎么辦,云原生越來越火用的框架是quarkus等新秀不是spring生態(tài)咋弄,http實現(xiàn)不是servlet而是jax-rs規(guī)范咋整, to be or not to be, this is a question.
目前java主流的權(quán)限框架有shiro,spring security, 下面對于它們的探討都是個人之見,接受糾正
shiro對于restful api原生支持不太友好,需要改寫一些代碼,2年前一個項目?booshiro?就是改造shiro,使其在過濾鏈就能匹配不同的rest請求進行權(quán)限校驗,之后給shiro commit幾次pr,fix其在過濾鏈匹配時的危險漏洞,總的來說shiro很強大但其起源并非面向web,對restful不是很友好
spring security很強大,與spring深度集成,離開spring,比如javalin和之前用過的osgi框架karaf就用不了了
如果不用注解配置,它們都會在鏈式匹配這塊,用請求的url和配置的鏈一個一個ant匹配(匹配過程中會有緩存等提高性能),但匹配的鏈過多時還是比較耗性能(根據(jù)算法時間復(fù)雜度判斷,暫未測試驗證)
我們希望能解決這些,提供一個針對restful api,無框架依賴,可以動態(tài)修改權(quán)限,多認證策略,更快速度,易用的認證鑒權(quán)框架
Introduction
sureness?是我們在使用?java?權(quán)限框架?shiro?之后,吸取其良好設(shè)計加上一些想法實現(xiàn)的全新認證鑒權(quán)項目
面對?restful api?的認證鑒權(quán),基于?rbac?(用戶-角色-資源)主要關(guān)注于對?restful api?的安全保護
無特定框架依賴(本質(zhì)就是過濾器處攔截判斷,已有springboot,quarkus,javalin,ktor等demo)
支持動態(tài)修改權(quán)限配置(動態(tài)修改哪些api需要被認證,可以被誰訪問)
支持主流http容器 servlet 和 jax-rs
支持多種認證策略,?jwt, basic auth?... 可擴展自定義支持的認證方式
基于改進的字典匹配樹擁有的高性能
良好的擴展接口, demo和文檔
sureness的低配置,易擴展,不耦合其他框架,能使開發(fā)者對自己的項目多場景快速安全的進行保護
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,只有(角色-資源)的映射,沒有(權(quán)限)動作映射,即 用戶-角色-資源
- 我們將restful api請求視作一個資源,資源格式為:?requestUri===httpMethod?即請求的路徑加上其請求方式(post,get,put,delete...) 作為一個整體被視作一個資源?eg: /api/v2/book===get?get方式請求/api/v2/book接口數(shù)據(jù)
- 角色資源映射: 用戶所屬角色--角色擁有資源--用戶擁有資源(用戶就能訪問此api)
項目中加入sureness
- 項目使用maven構(gòu)建,加入maven坐標
com.usthe.sureness sureness-core 0.1- 項目使用gradle構(gòu)建,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
添加攔截所有請求的過濾器入口
入口攔截器器實現(xiàn)一般可以是?filter or spring interceptor?在攔截器加入sureness的安全過濾器,如下:
入口,一般放在攔截所有請求的filter:
SurenessSecurityManager.getInstance().checkIn(servletRequest)實現(xiàn)相關(guān)異常處理
sureness使用異常處理流程,我們需要對checkIn拋出的異常做自定義處理,
安全過濾器,認證鑒權(quán)成功直接通過,失敗拋出特定異常,捕獲異常,如下:
try { SubjectSum subject = SurenessSecurityManager.getInstance().checkIn(servletRequest); } catch (ProcessorNotFoundException | UnknownAccountException | UnsupportedSubjectException e4) { // 賬戶創(chuàng)建相關(guān)異常 } catch (DisabledAccountException | ExcessiveAttemptsException e2 ) { // 賬戶禁用相關(guān)異常 } catch (IncorrectCredentialsException | ExpiredCredentialsException e3) { // 認證失敗相關(guān)異常 } catch (UnauthorizedException e5) { // 鑒權(quán)失敗相關(guān)異常 } catch (RuntimeException e) { // 其他自定義異常 }加載配置數(shù)據(jù)
sureness認證鑒權(quán),當(dāng)然也需要我們配置自己的配置數(shù)據(jù) - 賬戶數(shù)據(jù),角色權(quán)限數(shù)據(jù)等 這些配置數(shù)據(jù)可能來自文本,關(guān)系數(shù)據(jù)庫,非關(guān)系數(shù)據(jù)庫 我們提供了配置數(shù)據(jù)接口SurenessAccountProvider,?PathTreeProvider, 用戶可以實現(xiàn)此接口實現(xiàn)自定義配置數(shù)據(jù)源 當(dāng)前我們也提供默認文本形式的配置數(shù)據(jù)實現(xiàn)?DocumentResourceDefaultProvider, 用戶可以配置sureness.yml來配置數(shù)據(jù) 默認文本數(shù)據(jù)源sureness.yml配置詳見文檔?默認數(shù)據(jù)源
我們提供了使用代碼DEMO:默認文本數(shù)據(jù)源具體實現(xiàn),請參考使用sureness10分鐘搭建權(quán)限項目--sample-bootstrap
若權(quán)限配置數(shù)據(jù)來自數(shù)據(jù)庫,請參考使用sureness30分鐘搭建權(quán)限項目--sample-tom
HAVE FUN
非常歡迎參與項目使用和貢獻,幫助sureness走得更遠更好。對項目代碼有疑問或者建議請直接聯(lián)系 @tomsun28
-?END -
總結(jié)
以上是生活随笔為你收集整理的java鉴权_一个开箱即用的高效认证鉴权框架,专注于restful api的认证鉴权动态保护...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果手机原装充电器多少钱?
- 下一篇: perl语言编程 第四版_2020年,5