Shiro的統一認證授權
Shiro是Apache下面的一個簡單,易用的Java許可權架構,對於單體應用來講,Shiro完全能夠極好的,快速的滿足許可權的需求,所以一般在做項目的時候,Shiro都會成為開發人員的首選。
可是,如果你需要做第二個,第三個,第n個應用,同樣需要相同的認證、授權時,可能就需要對Shiro進行一定的擴充或者是整合其它架構,才能很好的滿足你的需求了。
Shiro是如何進行認證授權
Shiro本身並沒有幫你實現認證、授權,但Shiro很好的定義了許可權相關的一些概念,讓你完成具體的實現
認證
在Shiro裡,完成認證一般是這樣的subject.login(token),Subject代表一個使用者,Token代表一個使用者請求授權時提交的授權資訊,通過AuthenticatingRealm.doGetAuthenticationInfo()擷取到當前Subject的一些資訊,比如Principals,Credentials,校正提交的token,如果登入成功,儲存當前登入使用者
授權
在Shiro裡,許可權控制一般是這樣的@RequiresPermissions,當使用者訪問受保護資源的時候,Shiro會通過AuthorizingRealm.doGetAuthorizationInfo(),從當前認證通過Subject的Principals裡擷取使用者的許可權,判斷使用者是否能訪問該資源
在Shiro裡,通過實現Realm來完成上面2件事情,當你時單體應用的時候,非常簡單就能完成應用的認證授權。
但是當你有多個應用,需要複用同一套使用者以及許可權資訊時該怎麼做呢,可以複用Realm,使用者權限在同一個db中,這樣的話是可以實現的,但是耦合太高,不同的應用必須要接入同一個資料來源才行;或者可以把使用者權限相關的DAO剝離出來,作為RPC或Rest調用,也可以實現;但是更好的方式是把認證授權整個剝離出來,單獨作為認證授權服務
基於Shiro的統一認證授權
為了實現統一認證授權,Shiro有CasFilter,可以整合CAS,但是CAS又是另外一套架構,較為重,有單獨的學習成本,所以這裡介紹一種更簡單,輕量,易用的,基於Shiro的認證授權服務shiro-uaa
認證授權流程
使用者請求受保護資源Resource Server
Resource Server判斷使用者是否已經登入
如果沒有登入,Resource Server引導使用者到UAA Server進行登入
使用者在UAA Server登入,如果登入成功,UAA Server返回code給使用者,並引導使用者到之前訪問的Resource Server
Resource Server用code到UAA Server擷取access-token,token包含使用者授權資訊
Resource Server驗證accessToken是否合法,如果合法,在Resource Server儲存使用者資訊
如:
使用
auth-server
引用maven
實現自己的登入
resource-server
引用maven
和shiro一樣,使用相關註解進行許可權控制
基本上開箱即用,目前auth-server只是作為jar包提供,需要自己實現登入邏輯,後續會有可部署服務
shiro-uaa具體的相關說明介紹可以查看項目地址