一步步学习Keycloak(基础篇)

介绍

最近在研究如何使用KeyCloak来对系统进行认证和授权,相比其他开源的身份认证和授权系统,比如Justauth,我觉得KeyCloak有几个优点。第一是功能十分强大,基本上覆盖了认证和授权的各方面,能够提供SSO,可以支持不同的认证授权方式,OpenID,SAML,也支持不同的服务提供商,比如Google,Facebook,Github等。第二是提供了非常全面的技术文档,包括简单实例,认证,授权,部署以及API文档,而且分类清晰。第三是提供了易用的界面管理,能方便快速的进行用户,组,角色,资源,权限等的配置。唯一的缺点是文档过于偏技术和概念,实例太少,读起来比较晦涩难懂。另外,网上普遍的反应是KeyCloak比较重,可能是大部分应用场景可能只需要其中某一个功能,因此会显得很多功能多余。但作为一个身份认证框架,需要考虑各种认证场景和集成方式。KeyCloak虽然文档很全面,但是要完全理解里面的概念及功能,还是需要花很多的时间去理解和学习,大部分网上的实例都比较简单,基本都是在重复KeyCloak里面的Getting Started Guide里的三个例子。我将通过一个非常通用的实例来介绍如何通过KeyCloak来进行认证和授权,这个实例中会涉及到各种资源的认证授权方式,以及如何在KeyCloak里进行配置。第二,KeyCloak已经提供了各种KeyCloak Adapter,包括SpringBoot,SpringBoot Security,Tomcat,Jetty以及J2EE,但是缺少对Nginx的支持,Nginx作为当前最为流行的反向代理工具,应用十分广泛,而且很多比较流行的API Gateway底层也能见到它的身影,因此对Nginx的支持十分有必要。因此我将介绍如何在Nginx中实现对KeyCloak的集成,作为Nginx KeyCloak Adapter。第三,在介绍这个实例的过程中,我会介绍一些KeyCloak的概念,文档中的概念太难懂,只看文档很难理解它的应用场景及作用,但通过实例就比较容易理解晦涩的概念。
我将要实现的实例比较简单但是很通用,比如在物业管理中,某一个物业管理员只能管理某一个楼或者某一个区域,因此他只能完成对这个楼或者这个区域里的物件进行管理。这个需求非常简单明了,但如何使用KeyCloak来进行权限认证和授权呢?
我将文章分为以下四个部分:
  1. KeyCloak功能及快速入门
  2. KeyCloak的Nginx Adapter实现
  3. KeyCloak如何对资源授权
  4. KeyCloak的Admin Client的使用

KeyCloak的介绍

Keycloak是为现代应用系统和服务提供开源的认证和授权访问控制管理。Keycloak 实现了OpenID、OAuth2.0、SAML单点登录协议,同时提供 LDAP 和 Active Directory 以及 OpenID Connect、SAML2.0 IdPs、Github、Google 等第三方登录适配功能,能够做到非常简单的开箱即用。提供的功能如下:

SSO

通过Keycloak处理用户认证,意味着你的应用不需要处理登录界面,认证用户,存储用户信息。一旦登录Keycloak, 用户不需要再次登录Keycloak管理下的其它应用。实现一次登录,多处登录不同应用,一处登出,所有应用登出。

集成身份认证系统

Keycloak通过配置,可实现对不同身份认证服务的集成,通过这些身份认证服务登录应用。

User Federation

在企业系统中有使用LDAP/AD管理用户,同样,Keycloak 提供了对LDAP/AD的集成方案,可以方便的同步用户。

Client Adapters

Keycloak提供了多种语言和不同平台的支持,支持标准协议,OpenID Connect, OAuth 2.0, and SAML等。下面是从官网上摘取的详细支持列表。

  1. OpenID Connect
    Java,JBoss EAP,WildFly,Fuse,Tomcat,Jetty 9,Servlet Filter,Spring Boot,Spring Security,JavaScript,Node.js,C#,Python,Android,iOS,Apache HTTP Server

  2. SAML
    Java,JBoss EAP,WildFly,Tomcat,Jetty,Apache HTTP Server

后台管理

Keycloak不仅提供了后台管理界面,同时还有AdminCLI,和RESTFul API方式管理后台。

KeyCloak的安装

Keycloak的安装

本地方式安装

可以从Keycloak的官网 https://www.keycloak.org/docs/latest/server_installation/index.html上下载最新版的Keycloak,有下面三个版本的Keycloak

  • keycloak-7.0.0.[zip|tar.gz]

  • keycloak-overlay-7.0.0.[zip|tar.gz]

  • keycloak-demo-7.0.0.[zip|tar.gz]
    keycloak-7.0.0.[zip|tar.gz]是服务发布版,仅包括运行Keycloak server的脚本和二进制文件。keycloak-overlay-7.0.0.[zip|tar.gz]是WildFly插件,可以安装在一个已经存在的WildFly发布版上。keycloak-demo-7.0.0.[zip|tar.gz]包括Keycloak服务的二进制文件,文档以及实例。

Docker方式安装

我推荐使用Keycloak的Docker安装,可以快速的安装和运行Keycloak。Docker Hub地址https://hub.docker.com/r/jboss/keycloak/。默认安装没有设置管理员的账号和密码,因此没法使用Keycloak的控制台,可以通过设置环境变量的方式设置初始的管理员账号和密码。实例如下

docker run -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD='welcome1' -p 8080:8080 jboss/keycloak

对于Keycloak使用的是H2数据库,可以配置成postgre,mysql和mariadb,具体配置方式可以使用环境变量DB_ADDR,DB_PORT,DB_DATABASE,DB_SCHEMA,DB_USER,DB_USER_FILE,DB_PASSWORD,DB_PASSWORD_FILE来配置。
下面使用postgre来配置Keycloak。

第一步,创建Docker用户定义网络

docker network create keycloak-network

第二步,使用Docker创建postgre数据库

docker run -d --name postgres --net keycloak-network -e POSTGRES_DB=keycloak -e POSTGRES_USER=keycloak -e POSTGRES_PASSWORD=password postgres

第三步,启动Keycloak

docker run --name keycloak --net keycloak-network jboss/keycloak

Keycloak的配置

安装完成Keycloak后,访问http://localhost:8080/auth/admin/使用初始的管理员用户名和密码来登陆Keycloak控制台。

创建新的领域(realm)

Realm是一个隔离的概念,Realm A中的用户与Realm B中的用户完全隔离。当然,也可以不创建Realm,直接用 Master 这个Realm,不过一般来说,为了资源的隔离,以及更好的安全性不太建议与管理员共用Realm。从Master的下拉菜单中点击"Add Realm",如下图所示:

创建新的用户
点击左边导航栏的Users,点击右边的"Add user"来创建新的用户。输入用户名,此参数是必须输入,其他字段可选。点击保存,会出现"Credentials"标签,输入用户名和密码,然后”reset password”,可以关闭临时密码功能。如下图,

接着登出Keycloak,使用上面创建的用户名和密码登陆创建的demo realm,http://localhost:8080/auth/realms/demo/account

还有创建client,role,group,policy,resource,permission等功能,在以后的文章中使用时将会讲解如何创建。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,245评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,749评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,960评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,575评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,668评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,670评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,664评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,422评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,864评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,178评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,340评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,015评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,646评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,265评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,494评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,261评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,206评论 2 352