Spring Boot/Angular整合Keycloak實現單點登錄

未完待續

Keycloak

Keycloak爲現代應用和服務提供開源的認證和訪問管理,即通常所說的認證和授權。Keycloak支持OpenID、OAuth 2.0和SAML 2.0協議;支持用戶註冊、用戶管理、權限管理;支持OTP,支持代理OpenID、SAML 2.0 IDP,支持GitHub、LinkedIn等第三方登錄,支持整合LDAP和Active Directory;支持自定義認證流程、自定義用戶界面,支持國際化。

Keycloak支持Java、C#、Python、Android、iOS、JavaScript、Nodejs等平臺或語言,提供簡單易用的Adapter,僅需少量配置和代碼即可實現SSO。

Keycloak新的發行版命名爲Quarkus,專爲GraalVM和OpenJDK HotSpot量身定製的一個Kurbernetes Native Java框架,計劃2019年底正式發佈。

安裝

Keycloak構建在WildFly application server之上,從官網下載Standalone server distribution解壓後運行bin/standalone.sh即可啓動。默認使用h2數據庫,可以修改配置使用其它數據庫。Standalone Clustered Mode、Domain Clustered Mode啓動模式和更多配置請參閱官方文檔。
默認,本地網址爲http://localhost:8080/auth ,首次登錄時必須創建admin用戶:
Spring Boot/Angular整合Keycloak實現單點登錄
直接登錄Admin Console http://localhost:8080/auth/admin/
Spring Boot/Angular整合Keycloak實現單點登錄

Realm

Spring Boot/Angular整合Keycloak實現單點登錄
爲保護不同的應用,通常創建不同的Realm,各Realm間的數據和配置是獨立的。初始創建的Realm爲Master,Master是最高級別的Realm。Master Realm內的admin用戶(授予admin角色的用戶)擁有查看和管理任何其它realm的權限。因此,不推薦使用master realm管理用戶和應用,而應僅供超級管理員來創建和管理realm。
每個realm有專用的管理控制檯,可以設置自已的管理員賬號,比如接下來我們創建的heroes realm,控制檯網址爲http://localhost:8080/auth/admin/heroes/console 。
創建Heroes realm,點擊左上角下拉菜單-》Add realm:
Spring Boot/Angular整合Keycloak實現單點登錄
Spring Boot/Angular整合Keycloak實現單點登錄
Login Tab中有多個可配置選項:用戶註冊、編輯用戶名、忘記密碼、記住我、驗證email、使用email登錄、需要SSL。
Spring Boot/Angular整合Keycloak實現單點登錄
其中,Require SSL有三個選項:all requests、external requests、none,默認爲external requests,在生產環境中應配置爲all requests。

  • all requests 所有請求都需通過HTTPS訪問
  • external requests localhost和私有IP不需通過HTTPS訪問
  • none 任何客戶端都不需HTTPS

Themes Tab可以配置界面主題、啓用國際化:
Spring Boot/Angular整合Keycloak實現單點登錄
Tokens Tab可以配置token簽名算法、過期時間等。

Client

Client是realm中受信任的應用。
Spring Boot/Angular整合Keycloak實現單點登錄
創建realm後自動創建以下client:

  • account 賬戶管理

Spring Boot/Angular整合Keycloak實現單點登錄
如Realm配置中啓用了User-Managed Access則可以管理自己的Resource:
Spring Boot/Angular整合Keycloak實現單點登錄

  • admin-cli
  • broker
  • realm-management 預置了realm管理角色,創建realm管理員時需要分配這些角色
  • security-admin-console realm管理控制檯

創建heroes client,點擊Clients右上方的Create:
Spring Boot/Angular整合Keycloak實現單點登錄
Spring Boot/Angular整合Keycloak實現單點登錄
Client Protocol使用默認值openid-connect。Access Type有三個選項confidential、public、bearer-only,保持默認值public。confidential需要client secret,但我們將在web應用中使用此client,無法以安全的方式傳輸secret,必須使用public client,只要嚴格使用HTTPS,可以保證安全。Valid Redirect URIs輸入 http://localhost:4200/* 。

認證流程:

  • Standard Flow 即OAuth 2.0規範中的Authorization Code Flow,推薦使用的認證流程,安全性高。keycloak驗證用戶後附加一次性、臨時的Authorization Code重定向到瀏覽器,瀏覽器憑此Code與keycloak交換token(identity、access和refresh token)
  • Implicit Flow keycloak驗證用戶後直接返回identity和access token
  • Direct Access Grants REST client獲取token的方式,使用HTTP Post請求,響應結果包含access和refresh token

調用示例,請求地址:http://localhost:8080/auth/realms/heroes/protocol/openid-connect/token
Spring Boot/Angular整合Keycloak實現單點登錄

Client Scope

Client Scope定義了協議映射關係,keycloak預定義了一些Scope,每個client會自動繼承,這樣就不必在client內重複定義mapper了。Client Scope分爲default和optional兩種, default scope會自動生效,optional scope指定使用時才生效。
Spring Boot/Angular整合Keycloak實現單點登錄
啓用optional scope需要使用scope參數:
Spring Boot/Angular整合Keycloak實現單點登錄
啓用相應scope或配置mapper後,才能在client的token或userinfo中顯示相應的屬性。比如,上圖中我們啓用了phone scope,phone mapper中定義了phone number:
Spring Boot/Angular整合Keycloak實現單點登錄
如果用戶屬性中定義了phoneNumber,在token中則會顯示phone_number,可以在heroes client -> Client Scopes -> Evaluate查看效果:
Spring Boot/Angular整合Keycloak實現單點登錄

Role、Group、User

Role
Role分爲兩種級別:Realm、Client,默認Realm Role:offline_access、uma_authorization。

  • offline access
    OpenID規範中定義了offline access,用戶登錄獲得offline token,當用戶退出後offline token仍可使用。在很多場景中是非常有用的,比如每日離線備份數據。要獲得offline token除需offline_access角色外,還需指定offline_access Scope。默認,offline token不會過期,但需每30天刷新一次。offline token可以撤銷:
    Spring Boot/Angular整合Keycloak實現單點登錄
  • uma_authorization
    uma是User-Managed Access的縮寫,Keycloak是符合UMA 2.0功能的授權服務器。
    Role、Group和User的關係
    User可以屬於一個或多個Group,Role可以授予User和Group。
    創建Realm管理用戶
    添加用戶:
    Spring Boot/Angular整合Keycloak實現單點登錄
    授予realm-management權限:
    Spring Boot/Angular整合Keycloak實現單點登錄

    Authentication

    Keycloak預定義了Browser、Direct Grant、Registration、Reset Credentials等認證流程,用戶也可以自定義。以Brower流程爲例:
    Spring Boot/Angular整合Keycloak實現單點登錄
    Required是必須執行的,Alternative至少須執行一個,Optional則由用戶自己決定是否啓用。Browser流程中Cookie(Session Cookie)、Identity Provider Redirector、Forms均爲Alternative,因此只有前者沒有驗證成功纔會執行後者。其中Identity Provider可以配置默認provider;當執行Form認證時,用戶名/密碼是必須的,OTP爲可選的。登錄Account Console啓用OTP:
    Spring Boot/Angular整合Keycloak實現單點登錄

    Identity Provider

    支持代理OpenID、SAML 2.0 IDP,支持社區登錄。無論您採用什麼認證方式,token都由keycloak簽發,簡化了認證和授權管理。
    Identity Broker Flow:
    Spring Boot/Angular整合Keycloak實現單點登錄

    ADFS

    Salesforce

    Spring Boot

    Angular

    參考文檔

    Keycloak
    A Quick Guide to Using Keycloak with Spring Boot
    AD FS Docs
    Spring Boot and OAuth2
    OAuth 2.0 Login Sample
    Spring Boot and OAuth2 with Keycloak
    Spring SAML
    Springboot Oauth2 Server 搭建Oauth2認證服務
    How to Setup MS AD FS 3.0 as Brokered Identity Provider in Keycloak

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章