1. 程式人生 > >開源認證和訪問控制的利器keycloak使用簡介

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

[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的部落格 > > 歡迎關注我的公眾號:「程式那些事」最通俗的解讀,最深刻的乾貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!