簡介
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 :
可以看到登錄界面。點擊登錄。
這也就是keycloak登錄域WildFly的登錄界面,不過后面帶上了redirect_uri參數,說明登錄成功后,會跳轉回vanilla程序的界面。
我們使用之前創建的用戶名和密碼登錄看看。
登錄成功。
總結
上面的例子我們演示了如何配置keycloak,並且創建一個realm供第三方程序使用。還舉了一個無侵入的例子來和keycloak對接。
當然,有朋友會問了,vanilla程序是怎么和keycloak對接的呢?如果我們要寫一個自己的程序,應該怎么做呢?
別急,細節我會在后面的文章進行分享,敬請期待。
本文作者:flydean程序那些事
本文鏈接:http://www.flydean.com/keycloak-startup/
本文來源:flydean的博客
歡迎關注我的公眾號:「程序那些事」最通俗的解讀,最深刻的干貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!