介绍
单一登录(SSO)和相关令牌交换机制正在成为Web上不同环境中进行身份验证和授权的最常见方案,尤其是在迁移到云中时。
本文讨论了Keycloak与jBPM或Drools应用程序的集成,以便使用Keycloak上提供的所有功能。 Keycloak是用于浏览器应用程序和RESTful Web服务的集成SSO和IDM。 在Keycloak的主页上进一步了解它。
与Keycloak集成的结果具有许多优势,例如:
- 为包括jBPM和Drools工作台在内的不同客户提供集成的SSO和IDM环境
- 社交登录–使用您的Facebook,Google,Linkedin等帐户
- 用户会话管理
- 以及更多…
下一节将介绍Keycloak的以下集成点:
- 通过Keycloak服务器进行工作台身份验证 :它基本上包括通过Keycloak SSO保护Web客户端和远程服务客户端。 因此,Web界面或远程服务使用者(无论是用户还是服务)都将通过KC进行身份验证。
- 通过Keycloak服务器执行服务器认证 :包括保护执行服务器提供的远程服务(因为它不提供Web界面)。 任何远程服务使用者(无论是用户还是服务)都将通过KC验证身份。
- 消费远程服务 :本节描述第三方客户端如何使用由Workbench和Execution Server提供的远程服务端点。
情境
将下图视为本文示例的环境:
Keycloak是一个独立的过程,提供远程身份验证,授权和管理服务,这些服务可能会被一个或多个jBPM应用程序通过网络使用。
考虑以下用于构建此环境的主要步骤:
- 安装和设置Keycloak服务器
- 为此示例创建和设置领域-配置领域的客户端,用户和角色
- 安装和设置SSO客户端适配器和jBPM应用程序
笔记:
- 最终的环境和本文的不同配置均基于jBPM(KIE)工作台,但相同的环境也可以应用于KIE Drools工作台。
- 本示例使用最新的6.4.0.CR2社区发行版
步骤1 –安装和设置Keycloak服务器
Keycloak提供了广泛的文档以及有关在不同环境中进行安装的几篇文章。 本节介绍了用于构建示例的集成环境的最小设置。 如果需要更多信息,请参考Keycloak文档 。
以下是最小化Keycloak安装和设置的步骤:
- 从下载部分下载最新版本的Keycloak。 本示例基于Keycloak 1.9.0.Final。
- 将下载的Keycloak发行版解压缩到一个文件夹中,我们将其称为
$KC_HOME
- 运行KC服务器–此示例基于在同一主机上同时运行Keycloak和jBPM。 为了避免端口冲突,可以将Keycloak服务器的端口偏移量用作:
$KC_HOME/bin/standalone.sh -Djboss.socket.binding.port-offset=100
- 创建Keycloak的管理用户–执行以下命令以创建此示例的管理员用户:
$KC_HOME/bin/add-user.sh -r master -u 'admin' -p 'admin'
Keycloak管理控制台将位于http:// localhost:8180 / auth / admin (使用admin / admin作为登录凭据)。
第2步–创建并设置演示领域
安全领域用于限制对不同应用程序资源的访问。
Keycloak服务器运行之后,下一步就是创建领域。 该领域将为jBPM应用程序提供不同的用户,角色,会话等。
Keycloak提供了几个领域创建和管理的示例 ,从官方示例到带有更多示例的不同文章。
您可以手动创建领域,也可以仅导入给定的json文件。
逐步创建领域
请按照以下步骤操作,以创建本文稍后使用的演示领域:
- 转到Keycloak 管理控制台 ,然后单击“ 添加领域”按钮。 给它命名为demo 。
- 转到“客户端”部分(从管理控制台主菜单),然后为演示领域创建一个新客户端:
- 客户编号: kie
- 客户端协议: openid-connect
- 访问类型: 机密
- 根URL: http:// localhost:8080
- 基本网址: /kie-wb-6.4.0.Final
- 重定向URI: /kie-wb-6.4.0.Final/*
生成的kie客户端设置屏幕:
注意 :如您在上述设置中所看到的,它被认为是应用程序上下文路径的值kie-wb-6.4.0.Final 。 如果您的jbpm应用程序将部署在其他上下文路径,主机或端口上,请在此处使用您的具体设置。
能够使用jBPM工作台中的演示领域的最后一步是创建应用程序的用户和角色:
- 转到“角色”部分,并创建角色admin , kiemgmt和rest-all 。
- 转到“用户”部分并创建管理员用户。 在“凭据”选项卡中将密码设置为“ password”,然后取消设置临时开关。
- 在“用户”部分中,导航到“ 角色映射”选项卡,然后将admin, kiegmmt和rest-all角色分配给admin用户
导入演示领域
两者都导入:
- 演示领域–单击“ 添加领域”并使用demo-realm.json文件
- 领域用户–导入演示领域后,在主菜单中单击“ 导入” ,然后使用demo-users-0.json文件作为导入源
此时,Keycloak服务器正在主机上运行,使用最小配置集进行设置。 让我们转到jBPM工作台设置。
步骤3 –安装和设置jBPM工作台
对于本教程,让我们使用Wildfly作为jBPM工作台的应用程序服务器,就像jBPM安装程序默认情况下那样。
让我们假设在运行jBPM安装程序之后,将$ JBPM_HOME作为已将应用程序部署到其中的Wildfly服务器的根路径。
步骤3.1 –安装KC适配器
为了使用jBPM应用程序中的Keycloak身份验证和授权模块,必须在$ JBPM_HOME的服务器上安装Wildfly的Keycloak适配器 。 Keycloak为不同的容器提供了多个开箱即用的适配器,如果您正在使用另一个容器或需要使用另一个适配器,请查看Keycloak文档中的适配器配置 。 以下是安装和设置Wildfly 8.2.x适配器的步骤:
- 从此处下载适配器
- 执行以下命令:
cd $JBPM_HOME/ unzip keycloak-wf8-adapter-dist.zip // Install the KC client adapter cd $JBPM_HOME/bin ./standalone.sh -c standalone-full.xml // Setup the KC client adapter. // ** Once server is up, open a new command line terminal and run: cd $JBPM_HOME/bin ./jboss-cli.sh -c --file=adapter-install.cli
步骤3.2 –配置KC适配器
将KC适配器安装到Wildfly中之后,下一步就是配置适配器,以指定不同的设置,例如身份验证服务器的位置,要使用的领域等。
Keycloak提供了两种配置适配器的方式:
- 每个WAR配置
- 通过Keycloak子系统
在此示例中,我们使用第二个选项,即Keycloak子系统,因此我们的WAR不受此类设置的影响。 如果您想使用per WAR方法,请在此处查看 。
编辑配置文件$ JBPM_HOME / standalone / configuration / standalone-full.xml并找到子系统配置部分。 添加以下内容:
demo
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Q3RNbrVBcY7xbpkB2ELjbYvyx2Z5NOM/9gfkOkBLqk0mWYoOIgyBj4ixmG/eu/NL2+sja6nzC4VP4G3BzpefelGduUGxRMbPzdXfm6eSIKsUx3sSFl1P1L5mIk34vHHwWYR+OUZddtAB+5VpMZlwpr3hOlfxJgkMg5/8036uebbn4h+JPpvtn8ilVAzrCWqyaIUbaEH7cPe3ecou0ATIF02svz8o+HIVQESLr2zPwbKCebAXmY2p2t5MUv3rFE5jjFkBaY25u4LiS2/AiScpilJD+BNIr/ZIwpk6ksivBIwyfZbTtUN6UjPRXe6SS/c1LaQYyUrYDlDpdnNt6RboQIDAQAB
http://localhost:8180/auth
external
kie
true
925f9190-a7c1-4cfd-8a3c-004f9c73dae6
preferred_username
如果您在第2步中从本文中导入了示例json文件,则可以通过使用具体的部署名称来使用与上述相同的配置。 否则,请使用您的值进行以下配置:
- 安全部署的名称 –使用具体应用程序的WAR文件名
- 领域 –应用程序将使用的领域,在我们的示例中,是在第2步中创建的演示领域。
- 领域公钥 –在此提供演示领域的公钥。 它不是强制性的,如果未指定,将从服务器中检索它。 否则,您可以在Keycloak管理控制台->领域设置(用于演示领域)->密钥中找到它
- 身份验证服务器URL – Keycloak身份验证服务器的URL
- 资源 –在第2步中创建的客户端的名称。在我们的示例中,使用值kie 。
- 启用基本身份验证 –在此示例中,我们也启用基本身份验证机制,因此客户端可以同时使用令牌(Baerer)和基本方法来执行请求。
- 凭据 –使用kie客户端的密码值。 您可以在Keycloak管理控制台->客户端-> kie->凭据选项卡->复制密钥值中找到它。
对于此示例,您必须注意将您的具体值用于安全部署名称 , realm-public-key和凭据密码。 您可以在此处找到有关KC适配器配置的详细信息。
步骤3.3 –运行环境
此时,Keycloak服务器已在主机上启动并运行,并且已为jBPM应用程序服务器安装并配置了KC适配器。 您可以使用以下命令运行该应用程序:
$JBPM_HOME/bin/standalone.sh -c standalone-full.xml
服务器启动后,您可以导航到该应用程序: http:// localhost:8080 / kie-wb-6.4.0.Final
使用Keycloak的管理员用户凭据登录: admin / password
通过Keycloak保护工作台远程服务
jBPM和Drools工作台都提供了不同的远程服务端点,第三方客户端可以使用远程API来使用这些端点。
为了通过Keycloak对这些服务进行身份验证,必须禁用BasicAuthSecurityFilter ,对jBPM的WAR文件中的WEB-INF / web.xml文件(应用程序部署描述符)应用那些修改:
- 卸下过滤器:
< filter >
HTTP Basic Auth Filter org.uberfire.ext.security.server.BasicAuthSecurityFilter realmName KIE Workbench Realm HTTP Basic Auth Filter /rest/* /maven2/* /ws/* - 将远程服务网址格式限制为:
remote-services /rest/* /maven2/* /ws/* rest-all
重要说明 :使用远程服务的用户必须是角色rest-all的成员。 如第2步所述,此示例中的admin用户已经是rest-all角色的成员。
执行服务器
KIE Execution Server提供的REST API比任何第三方客户端都可以使用。 本节介绍如何将KIE Execution Server与Keycloak SSO集成在一起,以便将第三方客户端身份管理委派给SSO服务器。
考虑到以上环境正在运行,因此请考虑具有以下条件:
- 在http:// localhost:8180 / auth上运行并侦听的Keycloak服务器
- 一个名为demo的领域,其jBPM Workbench的客户端名为kie
- 运行在http:// localhost:8080 / kie-wb-6.4.0-Final的jBPM Workbench
请按照以下步骤将执行服务器添加到此环境中:
- 在Keycloak上为执行服务器创建客户端
- 安装安装程序和执行服务器(带有KC客户端适配器)
步骤1 –在Keycloak上为执行服务器创建客户端
根据要部署的每个执行服务器,您必须在Keycloak的演示领域中创建一个新客户端。
- 转到KC管理控制台 ->客户端->新客户端
- 名称: kie-execution-server
- 根URL:http:// localhost:8280 /
- 客户端协议:openid-connect
- 访问类型:机密(如果需要,则为公开,但不建议公开)
- 有效的重定向URI:/kie-server-6.4.0.Final/*
- 基本网址:/kie-server-6.4.0.Final
在此示例中,先前步骤中已经创建的管理员用户是用于客户端请求的管理员用户。 因此,请确保管理员用户是角色kie-server的成员,以便使用执行服务器的远程服务。 如果角色不存在,请创建它。
注意:此示例认为执行服务器将配置为使用200端口偏移量运行,因此HTTP端口将在localhost:8280可用
步骤2 –安装和设置KC客户端适配器和执行服务器
此时,一个名为kie-execution-server的客户端已准备就绪,可以在KC服务器上从执行服务器上使用。 让我们安装,设置和部署执行服务器:
- 安装另一个Wildfly服务器以用于执行服务器和KC客户端适配器。 您可以按照上面有关工作台的说明进行操作,也可以遵循官方的适配器文档 。
- 从Wildfly服务器的配置路径中编辑standalone-full.xml文件,并将KC子系统适配器配置为:
demo MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCrVrCuTtArbgaZzL1hvh0xtL5mc7o0NqPVnYXkLvgcwiC3BjLGw1tGEGoJaXDuSaRllobm53JBhjx33UNv+5z/UMG4kytBWxheNVKnL6GgqlNabMaFfPLPCF8kAgKnsi79NMo+n6KnSY8YeUmec/p2vjO2NjsSAVcWEQMVhJ31LwIDAQAB http://localhost:8180/auth external kie-execution-server true e92ec68d-6177-4239-be05-28ef2f3460ff preferred_username
如果与本示例不同,请考虑您的具体环境设置:
- 安全部署名称->使用正在部署的执行服务器war文件的名称
- 公钥->使用演示领域公钥或将其保留为空白,如果是这样,服务器将提供一个
- 资源->这次,而不是WB配置中使用的kie客户端,使用kie-execution-server客户端
- 启用基本身份验证->由您决定。 您可以为第三方服务使用者启用基本身份验证
- 凭据->将密钥用于kie-execution-server客户端。 您可以在KC管理控制台的“ 凭据”标签中找到它。
步骤3 –部署和运行执行服务器
只需使用任何可用机制在Wildfly中部署执行服务器即可。
使用以下命令运行执行服务器:
$EXEC_SERVER_HOME/bin/standalone.sh -c standalone-full.xml -Djboss.socket.binding.port-offset=200 -Dorg.kie.server.id= -Dorg.kie.server.user= -Dorg.kie.server.pwd= -Dorg.kie.server.location= -Dorg.kie.server.controller= -Dorg.kie.server.controller.user= -Dorg.kie.server.controller.pwd=
例:
$EXEC_SERVER_HOME/bin/standalone.sh -c standalone-full.xml -Djboss.socket.binding.port-offset=200 -Dorg.kie.server.id=kieserver1 -Dorg.kie.server.user=admin -Dorg.kie.server.pwd=password -Dorg.kie.server.location=http://localhost:8280/kie-server-6.4.0.Final/services/rest/server -Dorg.kie.server.controller=http://localhost:8080/kie-wb-6.4.0.Final/rest/controller -Dorg.kie.server.controller.user=admin -Dorg.kie.server.controller.pwd=password
重要说明 :将使用执行服务器远程服务端点的用户必须具有分配的角色kie-server。 因此,在KC管理控制台中为将使用执行服务器远程服务的用户创建并分配此角色。
一旦启动,您可以将服务器状态检查为(考虑到对此请求使用基本身份验证,请参阅下一个使用远程服务以获取更多信息):
curl http://admin:password@localhost:8280/kie-server-6.4.0.Final/services/rest/server/
消费远程服务
为了使用Workbench或Execution Server提供的不同远程服务,您的客户端必须在KC服务器上进行身份验证,并且必须具有有效的令牌才能执行请求。
注意 :请记住,为了使用远程服务,经过身份验证的用户必须已分配:
- 使用WB远程服务的所有角色
- 角色kie-server,用于使用Execution Server远程服务
请确保创建了必要的角色并将其分配给将在Keycloak管理控制台上使用远程服务的用户。
您有两个选择可以使用不同的删除服务端点:
- 如果应用程序的客户端支持基本身份验证,则使用它
- 使用基于承载(令牌)的身份验证
使用基本身份验证
如果KC客户端适配器配置启用了基本身份验证(如本指南中针对WB( 步骤3.2 )和Execution Server所建议的那样),则可以避免令牌授予/刷新调用,而只需调用服务即可,如以下示例所示。
WB远程存储库端点的示例:
curl http://admin:password@localhost:8080/kie-wb-6.4.0.Final/rest/repositories
检查执行服务器状态的示例:
curl http://admin:password@localhost:8280/kie-server-6.4.0.Final/services/rest/server/
使用基于令牌的身份验证
第一步是在Keycloak上创建一个新客户端,该客户端允许第三方远程服务客户端获取令牌。 可以通过以下方式完成:
- 转到KC管理控制台,然后使用以下配置创建新客户端 :
-
客户编号: kie-remote
- 当我们将要手动获取令牌并调用服务时,让我们稍微延长令牌的寿命。 在生产访问令牌中,令牌应具有相对较低的超时,最好少于5分钟:
-
转到KC管理控制台
创建用于远程客户端的公共客户端后,您现在可以通过对KC服务器的令牌端点执行HTTP请求来获取令牌。 这是命令行示例:
RESULT=`curl --data "grant_type=password&client_id=kie-remote&username=admin&passwordpassword=" http://localhost:8180/auth/realms/demo/protocol/openid-connect/token`
TOKEN=`echo $RESULT | sed 's/.*access_token":"//g' | sed 's/".*//g'`
此时,如果您回显$ TOKEN ,它将输出从KC服务器获得的令牌字符串,该令牌字符串现在可用于授权对远程端点的进一步调用。 例如,如果要检查内部jBPM存储库:
curl -H "Authorization: bearer $TOKEN" http://localhost:8080/kie-wb-6.4.0.Final/rest/repositories
翻译自: https://www.javacodegeeks.com/2016/03/keycloak-sso-integration-jbpm-drools-workbench.html