前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >单点登录,不要老盯着cas-server了,你还可以选择keycloak

单点登录,不要老盯着cas-server了,你还可以选择keycloak

作者头像
xjjdog
发布2020-11-02 10:35:22
1.8K0
发布2020-11-02 10:35:22
举报
文章被收录于专栏:架构专题架构专题

这里的cas不是Java并发包中的CAS,做过单点登录(SSO)的同学应该对它不会陌生。这个玩意太古老了,而且生态非常庞大,以至于我现在想起它都心有余悸。很长一段时间,做单点登录,或多或少都要参考CAS,这让人很头痛。

当然,我们有另外一个选择:keycloak,它是jboss出品的。凡是jboss出品的东西,都出奇的重,keycloak也不例外,涵盖了权限认证的各种场景的功能。这也是可以理解的,毕竟认证是个又脏又累的活,封装好它很不容易。

这就造成了,虽然keycloak提供了一个简单易用的控制后台,如果不了解一些验证的概念,用来来也并不顺手。

今天,xjjdog就来一个quickstart,品尝一下这个权限服务的味道。

首先,下载它的安装包。

代码语言:javascript
复制
wget -c https://downloads.jboss.org/keycloak/11.0.2/keycloak-11.0.2.zip

执行bin目录下的./standalone.sh文件,即可启动keycloak server。可以看到它监听在9990端口。

此时,访问这个链接得不到任何信息,因为里面还没有一个初始用户。就像盘古开天辟地一样,我们需要一个盘古。

使用add-user.sh命令,初始化一个用户。如果你初始化的是admin,就需要先把它给启用了。初始化以后,就可以在访问后台进行设置了。

Keycloak Server部署在8080端口,可以通过以下链接进行访问。

代码语言:javascript
复制
http://127.0.0.1:8080/auth/

1. 创建Realms

要想使用Keycloak,需要先生成一个Realm。Realm是领域的意思,在它其中,所有的用户和权限都是独立的。如果这些公司愿意的话,我可以把京东和淘宝的用户全部放在一个server上。

举以上例子是想说明,Realm这个东西,就是一个隔离措施。鼠标悬浮在左上角,点击add realm即可进入创建页面。

创建realm很简单,只需要提供一个名字就可以了。

但不要高兴的太早。作为一个全局配置,它的选项肯定是非常多的。不过这都属于自定义性的增强使用,我们这里不讨论它。

2. 创建权限

接下来,将创建两个权限组。权限也比较好理解,就是一个字符串而已。我们创建ROLE_ADMINROLE_USER两个权限。

3. 创建用户

该到了创建用户的时间了。在Users选项卡中点击新建就可进入创建目录。我们这里创建一个叫做xjjdog0的用户。

用户的选项也是非常多的。我们主要关注两部分。一个是Credentials,可以更新设置用户的密码;一个是Role Mappings,可以设置用户的权限。我们这里都操作一下,把xjjdog0的密码设置为123456

注意,这里有一个小小的细节。如果我们更新了用户的密码。在用户设置的主页面,将会出现update Password字样。它的意思是,需要用户进行一次自己的密码更新,这个用户才能真正使用。如果你不需要强制用户设置一遍密码,就可以把它删掉。

我们当然是把它删掉。

4. 创建client

要想在xjjdog这个领域里进行权限认证,还需要拿到一个clientid,用来标示自己的身份。

我们这里创建了一个叫做xjjdemo的client,稍后会在token接口中带它进去。

5. 测试token接口

获取接口的地址为:

代码语言:javascript
复制
ip:port/auth/realms/icp/protocol/openid-connect/token

在这里,根据我们上面设置的地址信息,可以构造出token的请求地址为:

代码语言:javascript
复制
http://localhost:8080/auth/realms/xjjdog/protocol/openid-connect/token

使用curl来获取token。

代码语言:javascript
复制
curl -XPOST -d 'client_id=xjjdemo&grant_type=password&scope=openid&username=xjjdog0&password=123456'  http://localhost:8080/auth/realms/xjjdog/protocol/openid-connect/token

提供了client_idgrant_typeusernamepassword等参数,发送post请求后会返回一个json。

代码语言:javascript
复制
{
	"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICItMXF4RW9NTU1ON29NM2NrZUhPaEowaFVZVGxQNThfMDNwMDYzV1hIVzQwIn0.eyJleHAiOjE2MDI2NTQ1NzMsImlhdCI6MTYwMjY1NDI3MywianRpIjoiMGQ1ZmZhNzgtZTQ5OS00MmFmLTgyMTUtNjgwODNiNjQ4ODRlIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F1dGgvcmVhbG1zL3hqamRvZyIsImF1ZCI6ImFjY291bnQiLCJzdWIiOiJjYWQ3NjNiMS01OTg3LTQzYTItOGQ4MC0yZDVlODY1ZGI3MTYiLCJ0eXAiOiJCZWFyZXIiLCJhenAiOiJ4ampkZW1vIiwic2Vzc2lvbl9zdGF0ZSI6ImQxMWQzOWM2LTBhMzItNDNlYi1iYTIyLTg1MzdlZWE4MDcwNiIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiLyoiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIlJPTEVfVVNFUiIsIm9mZmxpbmVfYWNjZXNzIiwiUk9MRV9BRE1JTiIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwicHJlZmVycmVkX3VzZXJuYW1lIjoieGpqZG9nMCJ9.DVX3VtSjq-hSsjEWqudKIcZhSpIuuDyalRx0epD93HMX8ap5z_7LpeITdb3aRv3AFIBQe8d80SsDZwUIj9NSobyMo8US4ZF4cLyHEYsp881-vJInnrQ-vbnxwShsx1r1S8NO7dV1CP-aD8b611JBtzxV-P6GPbiZH283BFMnKFHQ68aox0_VYEx3dq3PA53LyM8-_rCElrpyTHk1dUdC7OluPgLx390m9H0TV_2aR9ufXGA4e-xW5fmOFvAHGlg_t3BoDVAduQkoy_wYHA_NbP3uRIOcC0pgOonAsspT2lXA_xkPU8oIpPvBQzcV4eWivm1WV_y6K4kOvn0ZJtkFmA",
	"expires_in": 300,
	"refresh_expires_in": 1800,
	"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJjNGMwMzMzOC04MDU5LTRlNDItODYxMC1iYzkzMjNjZDY5NmIifQ.eyJleHAiOjE2MDI2NTYwNzMsImlhdCI6MTYwMjY1NDI3MywianRpIjoiNGE5ZjgxMGItMzc1ZC00OGRmLTg3YjYtN2UwODY4MmFhNDYxIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F1dGgvcmVhbG1zL3hqamRvZyIsImF1ZCI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hdXRoL3JlYWxtcy94ampkb2ciLCJzdWIiOiJjYWQ3NjNiMS01OTg3LTQzYTItOGQ4MC0yZDVlODY1ZGI3MTYiLCJ0eXAiOiJSZWZyZXNoIiwiYXpwIjoieGpqZGVtbyIsInNlc3Npb25fc3RhdGUiOiJkMTFkMzljNi0wYTMyLTQzZWItYmEyMi04NTM3ZWVhODA3MDYiLCJzY29wZSI6Im9wZW5pZCBlbWFpbCBwcm9maWxlIn0.mJYtSMQLgEDlzpX7_WC5pAF8s2DENZB1IBv20R2kZ8s",
	"token_type": "bearer",
	"id_token": "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICItMXF4RW9NTU1ON29NM2NrZUhPaEowaFVZVGxQNThfMDNwMDYzV1hIVzQwIn0.eyJleHAiOjE2MDI2NTQ1NzMsImlhdCI6MTYwMjY1NDI3MywiYXV0aF90aW1lIjowLCJqdGkiOiJmN2VjYjJlNi1mYmRlLTQ2ZjItOWE1Mi00YTEyMjlkYzQ5YjIiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvYXV0aC9yZWFsbXMveGpqZG9nIiwiYXVkIjoieGpqZGVtbyIsInN1YiI6ImNhZDc2M2IxLTU5ODctNDNhMi04ZDgwLTJkNWU4NjVkYjcxNiIsInR5cCI6IklEIiwiYXpwIjoieGpqZGVtbyIsInNlc3Npb25fc3RhdGUiOiJkMTFkMzljNi0wYTMyLTQzZWItYmEyMi04NTM3ZWVhODA3MDYiLCJhdF9oYXNoIjoiM1h0eEhqTUQ5Q3FNdEwxcWFxTlFfZyIsImFjciI6IjEiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsInByZWZlcnJlZF91c2VybmFtZSI6InhqamRvZzAifQ.EvUbCmrylfwFL0rhyX36nnxFNRTvtYZAkPYtLv6r8CCbolRHwNJDJflu44BpLQBJGD4UNFkvfsz1BmU-mAw5soxS7eaupOm8LGkUm_qmgj-qtH0eGRi4FlUq4Tw3gx4lGoyR1zNlt1dkcAhjNtyXkhZWjcjDownLgFajNrUCOUiFw1XZwBDPlyy5AQ8d1Kkc5RIF6zhy4bkXKp_fakTNWJPr2-C1xYcEssGOv81FVUajszmItnWP4SnJvzER_njpmnjg_b1lPMng-zMx-R7zgQrx06JStO0IKUd8hXSSmudpw652whR31cCWbTBhfNB2RH_Rnfrau2047WZ36I8zmg",
	"not-before-policy": 0,
	"session_state": "d11d39c6-0a32-43eb-ba22-8537eea80706",
	"scope": "openid email profile"
}

access_tokenid_token比较眼熟,它用.分割了三部分,看起来像是JWT格式。

使用工具解码一看,果然是,于是瞬间的起来。

可以看到用户信息的playload区域内容还是非常多的。这种token放在网络上传输,肯定是非常浪费的。不过都21世纪了,这点浪费也是可以接受的。

请求下面的地址,可以验证userinfo。

代码语言:javascript
复制
curl -XPOST -d  'access_token={上面的token}' http://localhost:8080/auth/realms/xjjdog/protocol/openid-connect/userinfo

你将获得以下字样。

代码语言:javascript
复制
{
	"sub": "cad763b1-5987-43a2-8d80-2d5e865db716",
	"email_verified": false,
	"preferred_username": "xjjdog0"
}

End

可以看到,keycloak用的是无状态的方式进行的token管理,是基于比较先进的 OAuth 2.0JSON Web Token(JWT) 规范来设计的。这对于互联网应用来说,就天然拥有了横向扩展的能力。

keycloak集成到SpringBoot非常简单,官方就有这样的demo。keycloak的开发也非常活跃,master分支就在刚刚还提交了代码。总之,值得一试!

作者简介:小姐姐味道 (xjjdog),一个不允许程序员走弯路的公众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你探讨高并发世界,给你不一样的味道。我的个人微信xjjdog0,欢迎添加好友,进一步交流。

推荐阅读:

一杯苦咖啡 | 公司来了个漂亮女实习程序员 失联的架构师,只留下一段脚本 架构师写的BUG,非比寻常 nginx工程师,需要上承天命,下召九幽 实力解剖一枚挖矿脚本,风骚操作亮瞎双眼 又一P1故障,锅比脸圆 传统企业的人才们,先别忙着跳“互联网”! 面试官很牛,逼我尿遁 又一批长事务,P0故障谁来背锅? 一天有24个小时?别开玩笑了! 《程序人生》杀机! 可怕的“浏览器指纹”,让你在互联网上,无处可藏 2w字长文,让你瞬间拥有「调用链」开发经验 996的乐趣,你是无法想象的 作为高级Java,你应该了解的Linux知识(非广告) 必看!java后端,亮剑诛仙(最全知识点) 学完这100多技术,能当架构师么?(非广告) Linux上,最常用的一批命令解析(10年精选) 数百篇「原创」文章,助你完成技术「体系化」

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-10-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小姐姐味道 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 创建Realms
  • 2. 创建权限
  • 3. 创建用户
  • 4. 创建client
  • 5. 测试token接口
  • End
相关产品与服务
访问管理
访问管理(Cloud Access Management,CAM)可以帮助您安全、便捷地管理对腾讯云服务和资源的访问。您可以使用CAM创建子用户、用户组和角色,并通过策略控制其访问范围。CAM支持用户和角色SSO能力,您可以根据具体管理场景针对性设置企业内用户和腾讯云的互通能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档