單點登錄,不要老盯着cas-server了,你還可以選擇keycloak

單點登錄,不要老盯着cas-server了,你還可以選擇keycloak

不羨鴛鴦不羨仙,一行代碼調半天。原創:小姐姐味道(微信公衆號ID:xjjdog),歡迎分享,轉載請保留出處。

這裏的cas不是Java併發包中的CAS,做過單點登錄(SSO)的同學應該對它不會陌生。這個玩意太古老了,而且生態非常龐大,以至於我現在想起它都心有餘悸。很長一段時間,做單點登錄,或多或少都要參考CAS,這讓人很頭痛。

當然,我們有另外一個選擇:keycloak,它是jboss出品的。凡是jboss出品的東西,都出奇的重,keycloak也不例外,涵蓋了權限認證的各種場景的功能。這也是可以理解的,畢竟認證是個又髒又累的活,封裝好它很不容易。

這就造成了,雖然keycloak提供了一個簡單易用的控制後臺,如果不瞭解一些驗證的概念,用來來也並不順手。

今天,xjjdog就來一個quickstart,品嚐一下這個權限服務的味道。

首先,下載它的安裝包。


wget -c https://downloads.jboss.org/keycloak/11.0.2/keycloak-11.0.2.zip

執行bin目錄下的./standalone.sh文件,即可啓動keycloak server。可以看到它監聽在9990端口。

單點登錄,不要老盯着cas-server了,你還可以選擇keycloak

此時,訪問這個鏈接得不到任何信息,因爲裏面還沒有一個初始用戶。就像盤古開天闢地一樣,我們需要一個盤古。

使用add-user.sh命令,初始化一個用戶。如果你初始化的是admin,就需要先把它給啓用了。初始化以後,就可以在訪問後臺進行設置了。

單點登錄,不要老盯着cas-server了,你還可以選擇keycloak

Keycloak Server部署在8080端口,可以通過以下鏈接進行訪問。

http://127.0.0.1:8080/auth/

1. 創建Realms
要想使用Keycloak,需要先生成一個Realm。Realm是領域的意思,在它其中,所有的用戶和權限都是獨立的。如果這些公司願意的話,我可以把京東和淘寶的用戶全部放在一個server上。

舉以上例子是想說明,Realm這個東西,就是一個隔離措施。鼠標懸浮在左上角,點擊add realm即可進入創建頁面。

單點登錄,不要老盯着cas-server了,你還可以選擇keycloak

創建realm很簡單,只需要提供一個名字就可以了。

單點登錄,不要老盯着cas-server了,你還可以選擇keycloak

但不要高興的太早。作爲一個全局配置,它的選項肯定是非常多的。不過這都屬於自定義性的增強使用,我們這裏不討論它。

單點登錄,不要老盯着cas-server了,你還可以選擇keycloak

2. 創建權限
接下來,將創建兩個權限組。權限也比較好理解,就是一個字符串而已。我們創建ROLE_ADMIN和ROLE_USER兩個權限。
單點登錄,不要老盯着cas-server了,你還可以選擇keycloak

3. 創建用戶
該到了創建用戶的時間了。在Users選項卡中點擊新建就可進入創建目錄。我們這裏創建一個叫做xjjdog0的用戶。

單點登錄,不要老盯着cas-server了,你還可以選擇keycloak

用戶的選項也是非常多的。我們主要關注兩部分。一個是Credentials,可以更新設置用戶的密碼;一個是Role Mappings,可以設置用戶的權限。我們這裏都操作一下,把xjjdog0的密碼設置爲123456。
單點登錄,不要老盯着cas-server了,你還可以選擇keycloak

注意,這裏有一個小小的細節。如果我們更新了用戶的密碼。在用戶設置的主頁面,將會出現update Password字樣。它的意思是,需要用戶進行一次自己的密碼更新,這個用戶才能真正使用。如果你不需要強制用戶設置一遍密碼,就可以把它刪掉。

我們當然是把它刪掉。

單點登錄,不要老盯着cas-server了,你還可以選擇keycloak

4. 創建client
要想在xjjdog這個領域裏進行權限認證,還需要拿到一個clientid,用來標示自己的身份。

我們這裏創建了一個叫做xjjdemo的client,稍後會在token接口中帶它進去。

單點登錄,不要老盯着cas-server了,你還可以選擇keycloak

5. 測試token接口
獲取接口的地址爲:


ip:port/auth/realms/icp/protocol/openid-connect/token

在這裏,根據我們上面設置的地址信息,可以構造出token的請求地址爲:


http://localhost:8080/auth/realms/xjjdog/protocol/openid-connect/token

使用curl來獲取token。


curl -XPOST -d 'client_id=xjjdemo&grant_type=password&scope=openid&username=xjjdog0&password=123456'  http://localhost:8080/auth/realms/xjjdog/protocol/openid-connect/token

提供了client_id,grant_type,username,password等參數,發送post請求後會返回一個json。


{
    "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICItMXF4RW9NTU1ON29NM2NrZUhPaEowaFVZVGxQNThfMDNwMDYzV1hIVzQwIn0.eyJleHAiOjE2MDI2NTQ1NzMsImlhdCI6MTYwMjY1NDI3MywianRpIjoiMGQ1ZmZhNzgtZTQ5OS00MmFmLTgyMTUtNjgwODNiNjQ4ODRlIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F1dGgvcmVhbG1zL3hqamRvZyIsImF1ZCI6ImFjY291bnQiLCJzdWIiOiJjYWQ3NjNiMS01OTg3LTQzYTItOGQ4MC0yZDVlODY1ZGI3MTYiLCJ0eXAiOiJCZWFyZXIiLCJhenAiOiJ4ampkZW1vIiwic2Vzc2lvbl9zdGF0ZSI6ImQxMWQzOWM2LTBhMzItNDNlYi1iYTIyLTg1MzdlZWE4MDcwNiIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiLyoiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIlJPTEVfVVNFUiIsIm9mZmxpbmVfYWNjZXNzIiwiUk9MRV9BRE1JTiIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwicHJlZmVycmVkX3VzZXJuYW1lIjoieGpqZG9nMCJ9.DVX3VtSjq-hSsjEWqudKIcZhSpIuuDyalRx0epD93HMX8ap5z_7LpeITdb3aRv3AFIBQe8d80SsDZwUIj9NSobyMo8US4ZF4cLyHEYsp881-vJInnrQ-vbnxwShsx1r1S8NO7dV1CP-aD8b611JBtzxV-P6GPbiZH283BFMnKFHQ68aox0_VYEx3dq3PA53LyM8-_rCElrpyTHk1dUdC7OluPgLx390m9H0TV_2aR9ufXGA4e-xW5fmOFvAHGlg_t3BoDVAduQkoy_wYHA_NbP3uRIOcC0pgOonAsspT2lXA_xkPU8oIpPvBQzcV4eWivm1WV_y6K4kOvn0ZJtkFmA",
    "expires_in": 300,
    "refresh_expires_in": 1800,
    "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJjNGMwMzMzOC04MDU5LTRlNDItODYxMC1iYzkzMjNjZDY5NmIifQ.eyJleHAiOjE2MDI2NTYwNzMsImlhdCI6MTYwMjY1NDI3MywianRpIjoiNGE5ZjgxMGItMzc1ZC00OGRmLTg3YjYtN2UwODY4MmFhNDYxIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F1dGgvcmVhbG1zL3hqamRvZyIsImF1ZCI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hdXRoL3JlYWxtcy94ampkb2ciLCJzdWIiOiJjYWQ3NjNiMS01OTg3LTQzYTItOGQ4MC0yZDVlODY1ZGI3MTYiLCJ0eXAiOiJSZWZyZXNoIiwiYXpwIjoieGpqZGVtbyIsInNlc3Npb25fc3RhdGUiOiJkMTFkMzljNi0wYTMyLTQzZWItYmEyMi04NTM3ZWVhODA3MDYiLCJzY29wZSI6Im9wZW5pZCBlbWFpbCBwcm9maWxlIn0.mJYtSMQLgEDlzpX7_WC5pAF8s2DENZB1IBv20R2kZ8s",
    "token_type": "bearer",
    "id_token": "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICItMXF4RW9NTU1ON29NM2NrZUhPaEowaFVZVGxQNThfMDNwMDYzV1hIVzQwIn0.eyJleHAiOjE2MDI2NTQ1NzMsImlhdCI6MTYwMjY1NDI3MywiYXV0aF90aW1lIjowLCJqdGkiOiJmN2VjYjJlNi1mYmRlLTQ2ZjItOWE1Mi00YTEyMjlkYzQ5YjIiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvYXV0aC9yZWFsbXMveGpqZG9nIiwiYXVkIjoieGpqZGVtbyIsInN1YiI6ImNhZDc2M2IxLTU5ODctNDNhMi04ZDgwLTJkNWU4NjVkYjcxNiIsInR5cCI6IklEIiwiYXpwIjoieGpqZGVtbyIsInNlc3Npb25fc3RhdGUiOiJkMTFkMzljNi0wYTMyLTQzZWItYmEyMi04NTM3ZWVhODA3MDYiLCJhdF9oYXNoIjoiM1h0eEhqTUQ5Q3FNdEwxcWFxTlFfZyIsImFjciI6IjEiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsInByZWZlcnJlZF91c2VybmFtZSI6InhqamRvZzAifQ.EvUbCmrylfwFL0rhyX36nnxFNRTvtYZAkPYtLv6r8CCbolRHwNJDJflu44BpLQBJGD4UNFkvfsz1BmU-mAw5soxS7eaupOm8LGkUm_qmgj-qtH0eGRi4FlUq4Tw3gx4lGoyR1zNlt1dkcAhjNtyXkhZWjcjDownLgFajNrUCOUiFw1XZwBDPlyy5AQ8d1Kkc5RIF6zhy4bkXKp_fakTNWJPr2-C1xYcEssGOv81FVUajszmItnWP4SnJvzER_njpmnjg_b1lPMng-zMx-R7zgQrx06JStO0IKUd8hXSSmudpw652whR31cCWbTBhfNB2RH_Rnfrau2047WZ36I8zmg",
    "not-before-policy": 0,
    "session_state": "d11d39c6-0a32-43eb-ba22-8537eea80706",
    "scope": "openid email profile"
}

access_token和id_token比較眼熟,它用.分割了三部分,看起來像是JWT格式。

使用工具解碼一看,果然是,於是瞬間的起來。

單點登錄,不要老盯着cas-server了,你還可以選擇keycloak

可以看到用戶信息的playload區域內容還是非常多的。這種token放在網絡上傳輸,肯定是非常浪費的。不過都21世紀了,這點浪費也是可以接受的。

單點登錄,不要老盯着cas-server了,你還可以選擇keycloak

請求下面的地址,可以驗證userinfo。

curl -XPOST -d  'access_token={上面的token}' http://localhost:8080/auth/realms/xjjdog/protocol/openid-connect/userinfo

你將獲得以下字樣。


{
    "sub": "cad763b1-5987-43a2-8d80-2d5e865db716",
    "email_verified": false,
    "preferred_username": "xjjdog0"
}

End
可以看到,keycloak用的是無狀態的方式進行的token管理,是基於比較先進的 OAuth 2.0 和 JSON Web Token(JWT) 規範來設計的。這對於互聯網應用來說,就天然擁有了橫向擴展的能力。

keycloak集成到SpringBoot非常簡單,官方就有這樣的demo。keycloak的開發也非常活躍,master分支就在剛剛還提交了代碼。總之,值得一試!

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