一步步玩转测试平台开发(四):如何使用Keycloak进行Django身份验证(上)

在前文《如何制定合适的平台方案》中,提到了我们部门利用Keycloak打造了统一的身份认证系统,并且规划所有部门研发和使用的系统都要通过对接这套系统实现SSO(单点登录 SingleSignOn)。基于上面这个情况,我所开发的测试平台就不能搞特殊化(自己再维护一个独立的用户身份管理体系),也必须要使用这个公共的身份认证系统进行测试平台的身份验证工作。

说到这,自然有同学要问Keycloak是什么呢?下面我争取用简短的篇幅来描述清楚它。

Keycloak 是一个针对Web应用和RESTfull Web API 提供SSO,它是一个开源软件,基于 OAuth 2.0JSON Web Token(JWT) 规范。源码地址

核心概念:

  • users:用户是一个可以登陆系统的实体,它可以拥有联系它们自身的属性,例如邮箱、用户名、地址、电话号码或生日等,可以为user分配组别或者角色。
  • authentication:相当于密码,可以验证和识别一个user。
  • authorization:给予用户访问的过程。
  • credentials:证书,可以供keycloak验证用户的东西,例如密码、一次性密码、证书、指纹等。
  • roles:相当于用户的一个分类 ,一个组织可能有Admin\user\manager\emplee等角色,应用程序经常会分配权限给角色,而不是用户,因为用户太难管理。
  • user role mapping:定义了一个用户及角色的关系,一个用户可以属于零个或多个角色,用户与角色的映射关系,这样就可以决定用在各种资源访问的权限管理。
  • composite roles:复合角色可以包含其他的角色,用户拥有了复合角色就相当于拥有了它下面的所有子角色。
  • groups:组可以一组的用户,也可以将角色映射到角色中,用户可以成为组员后继承用组的角色
  • realms:领域,领域管理着一批,用户、证书、角色、组等,一个用户只能属于且能登陆到一个域,域之间是互相独立的,域只能管理在它下面的用户。
  • clients:客户端是一个实体,可以请求keycloak对用户进行身份验证,大部分情况下,客户端是应用或服务希望使用keycloak来保护自己和提供一个单点登录的解决方案。客户端也可以是一个实体,请求身份信息或一个访问信息,这样就可以调用其他keycloak保护的应用或服务了。

具体的使用场景是这样的:

每一个想要对接Keycloak的系统应用,在Keycloak都被叫做一个Client,需要在Keycloak上做相应的Client配置,并配置相应的用户域(realm)、用户角色。然后在需要对接Keycloak的系统应用(应用系统A)上配置相应的Keycloak设置,相应的认证中间件和应用。再在应用系统A登录页面的登录按钮配置相应登录跳转的设置(详细配置会在后文中详细图文说明)。上面说的所有配置都配置好后,那么就大功告成了。

这时当你想登录应用系统A时 -> 点击应用系统A的登录按钮 -> 系统会自动跳转到keylock的身份认证登录页 -> 输入完登录信息后 -> 自动跳转进入应用系统A主页(具体跳转到哪,根据你在应用系统A相关配置路径决定)

动画演示如下: 演示Demo.gif

那么如何使用Django对接Keycloak系统实现上面的演示功能呢?由于篇幅的原因,将会在《如何使用Keycloak进行Django身份验证(中)》上详细讲解(据我目前所知,该部分将会是国内首篇详细讲解此方案的文章)。下文主要介绍如何本地搭建和配置Keycloak环境。

第一步安装Java:

因为Keycloak是基于Java环境运行的,所以在安装该系统前,请先在本机安装java环境,我的安装的Java Version是1.8.0_131

第二步官网下载Keycloak:

Keycloak官网下载Keycloak server压缩包,由于公司在用的Keycloak版本比较低:4.4.0.Final,目前官网最新的版本已经是10.0.2了,更新的可真快。 下载Keycloak-server压缩包.jpg

第三步解压缩包,通过独立启动脚本来运行本地server:

解压上一步下载的压缩包,在bin文件下找到 standalone.bat和standalone.sh这两个文件。 如果你的是Windows系统,点击.bat文件,如果是Linux或者Mac系统,点击.sh文件启动Keycloak Server 如何启动Keycloak服务器.jpg

第四步登录进入Keycloak系统:

等第三步的启动脚本运行完,打开http://localhost:8080/auth/,然后点击Administration Console进入Keycloak后台管理登录界面,然后自己配置一下管理员账号,登录进入管理系统 Administration-Console.jpg

keycloak后台管理界面.jpg

第五步添加新的Realm(用户的域):

照下图操作添加一个名称为"employee_demo"的Realm Keycloak添加Realm按钮.png

Keycloak新建Realm.jpg 点击完create按钮后进入下图所示界面,配置这个Realm, 其中HTML Display name是Keycloak做身份登录认证时界面的显示名称(可以看一下最上面那个动图的演示,你就会明白了)。照下图配置完点击save按钮后,Realm的设置就配置完了。 Keycloak设置Realm名称.jpg

第六步添加一个该Realm下的用户:

照下图操作添加一个新用户 添加用户按钮.jpg 设置用户信息.jpg

到此为止基本的keycloak的配置就ok了,在接下来的文章:《如何使用Keycloak进行Django身份验证(中)》 中我将会介绍如何配置在Django上配置Keycloak,以及如何在Keycloak配置相应的client设置,该部分将会国内首篇详细讲解此方案的文章,后续精彩敬请期待。