開源認證和訪問控制的利器keycloak使用簡介
阿新 • • 發佈:2020-11-26
[toc]
# 簡介
keycloak是一個開源的進行身份認證和訪問控制的軟體。是由Red Hat基金會開發的,我們可以使用keycloak方便的嚮應用程式和安全服務新增身份認證,非常的方便。
keycloak還支援一些高階的特性,比如身份代理,社交登入等等。
本文將會帶領大家進入keycloak的神祕世界。
# 安裝keycloak
keycloak有很多種安裝模式,這裡我們先介紹最簡單的standalone模式。
要安裝keycloak,我們需要下載keycloak的zip包。在我寫這篇文章的時候,keycloak的最新版本是11.0.2。
下載連結如下: https://downloads.jboss.org/keycloak/11.0.2/keycloak-11.0.2.zip
下載完畢,解壓,
~~~shell
cd bin
./standalone.sh
~~~
我們可以簡單的挑選一些啟動日誌來分析一下:
~~~shell
=========================================================================
JBoss Bootstrap Environment
JBOSS_HOME: /Users/flydean/data/git/security/keycloak-11.0.2
JAVA: /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/bin/java
JAVA_OPTS: -server -Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true
=========================================================================
22:08:04,231 INFO [org.jboss.modules] (main) JBoss Modules version 1.10.1.Final
22:08:08,706 INFO [org.jboss.msc] (main) JBoss MSC version 1.4.11.Final
22:08:08,721 INFO [org.jboss.threads] (main) JBoss Threads version 2.3.3.Final
22:08:08,921 INFO [org.jboss.as] (MSC service thread 1-2) WFLYSRV0049: Keycloak 11.0.2 (WildFly Core 12.0.3.Final) starting
~~~
可以看到keycloak底層實際上使用的是WildFly伺服器,WildFly伺服器的前身就是JBoss,也是由red hat主導的。所以keycloak使用WildFly還是很合理的。
當我們看到下面的日誌的時候,就意味著keycloak啟動好了。
~~~shell
22:08:26,436 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0060: Http management interface listening on http://127.0.0.1:9990/management
22:08:26,437 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0051: Admin console listening on http://127.0.0.1:9990
~~~
接下來,我們需要為keycloak建立admin使用者。
# 建立admin使用者
啟動好keycloak之後,我們就可以登入到web頁面 http://localhost:8080/auth 建立admin使用者了。
![](https://img-blog.csdnimg.cn/2020091522151448.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_0,text_aHR0cDovL3d3dy5mbHlkZWFuLmNvbQ==,size_25,color_8F8F8F,t_70)
這是建立使用者的介面,我們輸入使用者名稱和密碼,點選create,就可以建立admin使用者了。
建立完admin使用者,點選登入到admin console,就會跳轉到admin console的登入頁面 http://localhost:8080/auth/admin/
輸入使用者名稱密碼,點選登入。
![](https://img-blog.csdnimg.cn/20200915221904300.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_0,text_aHR0cDovL3d3dy5mbHlkZWFuLmNvbQ==,size_25,color_8F8F8F,t_70)
然後就進入到了管理介面:
![](https://img-blog.csdnimg.cn/20200915222014442.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_0,text_aHR0cDovL3d3dy5mbHlkZWFuLmNvbQ==,size_25,color_8F8F8F,t_70)
可以看到管理介面提供的功能還是非常豐富的。
我們可以對realm,clients,roles,identity providers,user federation,authentication等進行配置和定義。
還可以對groups,users,sessions,events等進行管理,非常強大和方便。
# 建立realm和普通使用者
realm翻譯成中文就是域,我們可以將它看做是一個隔離的空間,在realm中我們可以建立users和applications。
keycloak中有兩種realm空間,一種是Master realm,一種是Other realms。
![](https://img-blog.csdnimg.cn/2020091522330333.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_0,text_aHR0cDovL3d3dy5mbHlkZWFuLmNvbQ==,size_25,color_8F8F8F,t_70)
master realm是指我們使用admin使用者登入進來的realm空間,這個realm只是用來建立其他realm的。
other realms是由master realm來建立的,admin可以建立users和applications,而這些applications是由users所有的。
點選add realm按鈕,我們進入add realm介面,輸入realm的名字,就可以建立realm了。
![](https://img-blog.csdnimg.cn/20200915225220203.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_0,text_aHR0cDovL3d3dy5mbHlkZWFuLmNvbQ==,size_25,color_8F8F8F,t_70)
上面的例子中,我們建立了一個叫做WildFly的realm。
接下來,我們為WildFly建立新的user:
![](https://img-blog.csdnimg.cn/20200915225516170.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_0,text_aHR0cDovL3d3dy5mbHlkZWFuLmNvbQ==,size_25,color_8F8F8F,t_70)
輸入使用者名稱,點選save。
選擇新建立user的credentials頁面,輸入要建立的密碼,點選set password,那麼新建立使用者的密碼則建立完畢。
![](https://img-blog.csdnimg.cn/20200915230140596.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_0,text_aHR0cDovL3d3dy5mbHlkZWFuLmNvbQ==,size_25,color_8F8F8F,t_70)
接下來,我們使用新建立的使用者flydean來登入realm WildFly,登入url如下:
http://localhost:8080/auth/realms/WildFly/account
輸入使用者名稱和密碼,進入使用者管理頁面:
![](https://img-blog.csdnimg.cn/20200915230729893.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_0,text_aHR0cDovL3d3dy5mbHlkZWFuLmNvbQ==,size_25,color_8F8F8F,t_70)
我們將使用者所需要的資料填充完畢,以供後面使用。
# 使用keycloak來保護你的應用程式
因為keycloak底層使用的是WildFly,為了簡單起見,這裡我們也使用keycloak來保護一個WildFly程式。
我從WildFly的官網下載最新版本的WildFly,然後解壓備用。
因為keycloak和WildFly都是在同一臺機子上面啟用。所以預設情況下埠都是一樣的8080。
接下來,我們需要修改一下keycloak的埠,以避免埠衝突。
~~~shell
cd bin
./standalone.sh -Djboss.socket.binding.port-offset=100
~~~
我們重啟一下keycloak,在啟動命令中添加了jboss.socket.binding.port-offset,這個是相對於標準埠的偏移量。
比如之前我們的埠是8080,那麼現在埠就是8180。
看一下,現在的管理頁面連結是不是變到了 http://localhost:8180/auth/admin/ 。
## 安裝WildFly client adapter
為了無縫整合WildFly,keycloak提供了多種adapter供我們使用:
![](https://img-blog.csdnimg.cn/20200916095420781.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_0,text_aHR0cDovL3d3dy5mbHlkZWFuLmNvbQ==,size_25,color_8F8F8F,t_70)
可以看到除了WildFly,keycloak還可以支援Jetty和Tomcat,我們可以在後面的文章中來講解如何整合keycloak到Jetty和Tomcat。
同時,client Adapters還有兩種協議格式,openid connect和SAML 2.0,我們也會在後面的文章中具體介紹一下這兩種協議,敬請期待。
好了,先下載WildFly adapter,將adapter放到WildFly的跟目錄下面:
~~~shell
server/wildfly-20.0.1.Final : ls
LICENSE.txt bin domain modules
README.txt copyright.txt jboss-modules.jar standalone
appclient docs keycloak-wildfly-adapter-dist-11.0.2.zip welcome-content
~~~
解壓adapter,解壓之後,進入wildfly-20.0.1.Final/bin目錄,執行:
~~~shell
./jboss-cli.sh --file=adapter-elytron-install-offline.cli
~~~
如果你得到下面的輸出結果:
~~~shell
{"outcome" => "success"}
{"outcome" => "success"}
{"outcome" => "success"}
{"outcome" => "success"}
~~~
那就說明adapter安裝成功了,這個指令碼會修改…/standalone/configuration/standalone.xml。
然後我們可以啟動WildFly了:
~~~java
./standalone.sh
~~~
## 註冊WildFly應用程式
回到我們的admin console: http://localhost:8180/auth/admin/
選擇我們之前建立的realm:WildFly,在clients選項中,我們建立新的client:
![](https://img-blog.csdnimg.cn/20200916111255160.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_0,text_aHR0cDovL3d3dy5mbHlkZWFuLmNvbQ==,size_25,color_8F8F8F,t_70)
建立完成之後,我們進入到installation tab:
![](https://img-blog.csdnimg.cn/20200916111523297.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_0,text_aHR0cDovL3d3dy5mbHlkZWFuLmNvbQ==,size_25,color_8F8F8F,t_70)
選擇keycloak OIDC JSON,點選Download,下載keycloak.json檔案。
然後選擇Keycloak OIDC JBoss Subsystem XML,點選下載,下載keycloak-oidc-subsystem.xml檔案。
接下來,我們需要修改WildFly配置資訊。
進入WildFly的standalone/configuration目錄,修改standalone.xml檔案如下:
~~~xml
WildFly
http://localhost:8180/auth/
true
EXTERNAL
vanilla
~~~
這個subsystem的內容實際上就是我們剛剛儲存的keycloak-oidc-subsystem.xml裡面的內容。
這裡我們需要知道secure-deployment的war名字,也就是我們接下來將要部署的應用程式的名字。
重啟WildFly。
## 安裝vanilla應用程式
為了簡單起見,我們直接從 https://github.com/keycloak/keycloak-quickstarts 中下載示例程式碼專案 app-profile-jee-vanilla。
~~~shell
git clone https://github.com/keycloak/keycloak-quickstarts
cd keycloak-quickstarts/app-profile-jee-vanilla/config
~~~
將剛剛下載的keycloak.json拷貝到當前目錄。
然後切換到keycloak-quickstarts父目錄,執行:
~~~java
mvn clean wildfly:deploy
~~~
這個命令將會打包成為適合WildFly執行的war包,也就是我們要的vanilla.war。
將打包好的vanilla.war拷貝到WildFly目錄下的standalone/deployments。
WildFly會自動重新部署該應用程式。
這時候我們訪問下應用程式 http://localhost:8080/vanilla :
![](https://img-blog.csdnimg.cn/20200916135635573.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_0,text_aHR0cDovL3d3dy5mbHlkZWFuLmNvbQ==,size_25,color_8F8F8F,t_70)
可以看到登入介面。點選登入。
先看下登入連結,自動跳轉到了 http://localhost:8180/auth/realms/WildFly/protocol/openid-connect/auth?response_type=code&client_id=vanilla&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Fvanilla%2Fprofile.jsp&state=8521b8ab-83f7-4fec-9ced-8c90a3d42839&login=true&scope=openid
這也就是keycloak登入域WildFly的登入介面,不過後面帶上了redirect_uri引數,說明登入成功後,會跳轉回vanilla程式的介面。
我們使用之前建立的使用者名稱和密碼登入看看。
![](https://img-blog.csdnimg.cn/20200916135947257.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_0,text_aHR0cDovL3d3dy5mbHlkZWFuLmNvbQ==,size_25,color_8F8F8F,t_70)
登入成功。
# 總結
上面的例子我們演示瞭如何配置keycloak,並且建立一個realm供第三方程式使用。還舉了一個無侵入的例子來和keycloak對接。
當然,有朋友會問了,vanilla程式是怎麼和keycloak對接的呢?如果我們要寫一個自己的程式,應該怎麼做呢?
別急,細節我會在後面的文章進行分享,敬請期待。
> 本文作者:flydean程式那些事
>
> 本文連結:[http://www.flydean.com/keycloak-startup/](http://www.flydean.com/keycloak-startup/)
>
> 本文來源:flydean的部落格
>
> 歡迎關注我的公眾號:「程式那些事」最通俗的解讀,最深刻的乾貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!