開源認證和訪問控制的利器keycloak使用簡介

flydean發表於2020-11-26

簡介

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

下載完畢,解壓,

cd bin
./standalone.sh

我們可以簡單的挑選一些啟動日誌來分析一下:

=========================================================================

  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啟動好了。

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使用者了。

這是建立使用者的介面,我們輸入使用者名稱和密碼,點選create,就可以建立admin使用者了。

建立完admin使用者,點選登入到admin console,就會跳轉到admin console的登入頁面 http://localhost:8080/auth/admin/

輸入使用者名稱密碼,點選登入。

然後就進入到了管理介面:

可以看到管理介面提供的功能還是非常豐富的。

我們可以對realm,clients,roles,identity providers,user federation,authentication等進行配置和定義。

還可以對groups,users,sessions,events等進行管理,非常強大和方便。

建立realm和普通使用者

realm翻譯成中文就是域,我們可以將它看做是一個隔離的空間,在realm中我們可以建立users和applications。

keycloak中有兩種realm空間,一種是Master realm,一種是Other realms。

master realm是指我們使用admin使用者登入進來的realm空間,這個realm只是用來建立其他realm的。

other realms是由master realm來建立的,admin可以建立users和applications,而這些applications是由users所有的。

點選add realm按鈕,我們進入add realm介面,輸入realm的名字,就可以建立realm了。

上面的例子中,我們建立了一個叫做WildFly的realm。

接下來,我們為WildFly建立新的user:

輸入使用者名稱,點選save。

選擇新建立user的credentials頁面,輸入要建立的密碼,點選set password,那麼新建立使用者的密碼則建立完畢。

接下來,我們使用新建立的使用者flydean來登入realm WildFly,登入url如下:

http://localhost:8080/auth/realms/WildFly/account

輸入使用者名稱和密碼,進入使用者管理頁面:

我們將使用者所需要的資料填充完畢,以供後面使用。

使用keycloak來保護你的應用程式

因為keycloak底層使用的是WildFly,為了簡單起見,這裡我們也使用keycloak來保護一個WildFly程式。

我從WildFly的官網下載最新版本的WildFly,然後解壓備用。

因為keycloak和WildFly都是在同一臺機子上面啟用。所以預設情況下埠都是一樣的8080。

接下來,我們需要修改一下keycloak的埠,以避免埠衝突。

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供我們使用:

可以看到除了WildFly,keycloak還可以支援Jetty和Tomcat,我們可以在後面的文章中來講解如何整合keycloak到Jetty和Tomcat。

同時,client Adapters還有兩種協議格式,openid connect和SAML 2.0,我們也會在後面的文章中具體介紹一下這兩種協議,敬請期待。

好了,先下載WildFly adapter,將adapter放到WildFly的跟目錄下面:

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目錄,執行:

./jboss-cli.sh --file=adapter-elytron-install-offline.cli

如果你得到下面的輸出結果:

{"outcome" => "success"}
{"outcome" => "success"}
{"outcome" => "success"}
{"outcome" => "success"}

那就說明adapter安裝成功了,這個指令碼會修改…​/standalone/configuration/standalone.xml。

然後我們可以啟動WildFly了:

./standalone.sh

註冊WildFly應用程式

回到我們的admin console: http://localhost:8180/auth/admin/

選擇我們之前建立的realm:WildFly,在clients選項中,我們建立新的client:

建立完成之後,我們進入到installation tab:

選擇keycloak OIDC JSON,點選Download,下載keycloak.json檔案。

然後選擇Keycloak OIDC JBoss Subsystem XML,點選下載,下載keycloak-oidc-subsystem.xml檔案。

接下來,我們需要修改WildFly配置資訊。

進入WildFly的standalone/configuration目錄,修改standalone.xml檔案如下:

        <subsystem xmlns="urn:jboss:domain:keycloak:1.1">
                <secure-deployment name="vanilla.war">
                <realm>WildFly</realm>
    <auth-server-url>http://localhost:8180/auth/</auth-server-url>
    <public-client>true</public-client>
    <ssl-required>EXTERNAL</ssl-required>
    <resource>vanilla</resource>
</secure-deployment>
        </subsystem>

這個subsystem的內容實際上就是我們剛剛儲存的keycloak-oidc-subsystem.xml裡面的內容。

這裡我們需要知道secure-deployment的war名字,也就是我們接下來將要部署的應用程式的名字。

重啟WildFly。

安裝vanilla應用程式

為了簡單起見,我們直接從 https://github.com/keycloak/keycloak-quickstarts 中下載示例程式碼專案 app-profile-jee-vanilla。

git clone https://github.com/keycloak/keycloak-quickstarts
cd keycloak-quickstarts/app-profile-jee-vanilla/config

將剛剛下載的keycloak.json拷貝到當前目錄。

然後切換到keycloak-quickstarts父目錄,執行:

mvn clean wildfly:deploy

這個命令將會打包成為適合WildFly執行的war包,也就是我們要的vanilla.war。

將打包好的vanilla.war拷貝到WildFly目錄下的standalone/deployments。

WildFly會自動重新部署該應用程式。

這時候我們訪問下應用程式 http://localhost:8080/vanilla

可以看到登入介面。點選登入。

先看下登入連結,自動跳轉到了 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程式的介面。

我們使用之前建立的使用者名稱和密碼登入看看。

登入成功。

總結

上面的例子我們演示瞭如何配置keycloak,並且建立一個realm供第三方程式使用。還舉了一個無侵入的例子來和keycloak對接。

當然,有朋友會問了,vanilla程式是怎麼和keycloak對接的呢?如果我們要寫一個自己的程式,應該怎麼做呢?

別急,細節我會在後面的文章進行分享,敬請期待。

本文作者:flydean程式那些事

本文連結:http://www.flydean.com/keycloak-startup/

本文來源:flydean的部落格

歡迎關注我的公眾號:「程式那些事」最通俗的解讀,最深刻的乾貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!

相關文章