1.Keycloak介绍
1.1 Keycloak 介绍
1.2 特点
浏览器应用程序的单点登录和单点登录。
OpenID Connect支持。
OAuth 2.0支持。
SAML支持。
身份代理-通过外部OpenID Connect或SAML身份提供程序进行身份验证。
社交登录-启用通过Google,GitHub,Facebook,Twitter和其他社交网络的登录。
用户联合-同步LDAP和Active Directory服务器中的用户。
Kerberos桥-自动验证登录到Kerberos服务器的用户。
管理控制台,用于集中管理用户,角色,角色映射,客户端和配置。
帐户管理控制台,允许用户集中管理其帐户。
主题支持-自定义所有面向用户的页面以与您的应用程序和品牌集成。
两因素身份验证-通过Google Authenticator或FreeOTP支持TOTP HOTP。
登录流程-可选的用户自我注册,恢复密码,验证电子邮件,要求密码更新等。
会话管理-管理员和用户本身可以查看和管理用户会话。
令牌映射器-将用户属性,角色等映射到令牌和语句的方式。
每个领域,应用程序和用户的撤销策略。
CORS支持-客户端适配器具有对CORS的内置支持。
服务提供商接口(SPI)-用于自定义服务器各个方面的许多SPI。身份验证流,用户联合提供程序,协议映射器等等。
适用于JavaScript应用程序,WildFly,JBoss EAP,Fuse,Tomcat,Jetty,Spring等的客户端适配器。
支持任何具有OpenID Connect依赖方库或SAML 2.0服务提供商库的平台/语言。
1.3如何保证安全
1.4 核心概念
users
用户是能够登录系统的实体。他们可以具有与自己相关联的属性,例如电子邮件,用户名,地址,电话号码和生日。可以为他们分配组成员身份,并为其分配特定的角色。
authentication
识别和验证用户的过程。
authorization
授予用户访问权限的过程。
credentials
凭证是Keycloak用来验证用户身份的数据。比如是密码,一次性密码,数字证书甚至指纹。
roles
角色标识用户的类型或类别。
Admin
,user
,manager
,并且employee
是可以在一个组织中存在的所有典型的角色。应用程序通常将访问和权限分配给特定角色,而不是单个用户,因为与用户打交道可能过于精细且难以管理。user role mapping
用户角色映射定义角色和用户之间的映射。一个用户可以与零个或多个角色相关联。可以将此角色映射信息封装到令牌和断言中,以便应用程序可以决定对其管理的各种资源的访问权限。
composite roles
复合角色是可以与其他角色关联的角色。例如,
superuser
复合角色可以与sales-admin
和order-entry-admin
角色相关联 。如果将用户映射到superuser
角色,他们还将继承sales-admin
和order-entry-admin
角色。groups
组管理用户组。可以为组定义属性。您也可以将角色映射到组。成为组成员的用户将继承该组定义的属性和角色映射。
realms
领域管理一组用户,凭据,角色和组。用户属于并登录到领域。领域彼此隔离,并且只能管理和认证他们控制的用户。
clients
客户端是可以请求Keycloak验证用户身份的实体。大多数情况下,客户端是希望使用Keycloak来保护自身并提供单一登录解决方案的应用程序和服务。客户端也可以是只想请求身份信息或访问令牌的实体,以便它们可以安全地调用网络上由Keycloak保护的其他服务。
client adapters
客户端适配器是您安装到应用程序环境中的插件,以便能够通过Keycloak进行通信和保护。Keycloak有许多可以下载的用于不同平台的适配器。您还可以获得针对我们未涵盖的环境的第三方适配器。
consent
同意是指您作为管理员希望用户在客户端可以参与身份验证过程之前向其授予权限。用户提供凭据后,Keycloak将弹出一个屏幕,该屏幕标识请求登录的客户端以及请求用户的身份信息。用户可以决定是否准予该请求。
client scopes
注册客户端后,您必须为该客户端定义协议映射器和角色范围映射。存储客户端范围通常很有用,通过共享一些通用设置使创建新客户端更加容易。这对于根据
scope
参数的值有条件地要求某些声明或角色也很有用。Keycloak为此提供了客户端作用域的概念。client role
客户可以定义特定于他们的角色。这基本上是专用于客户端的角色名称空间。
identity token
提供有关用户身份信息的令牌。OpenID Connect规范的一部分。
access token
可以作为HTTP请求的一部分提供的令牌,该令牌授予对正在调用的服务的访问权限。这是OpenID Connect和OAuth 2.0规范的一部分。
assertion
有关用户的信息。这通常与XML Blob有关,该XML Blob包含在SAML身份验证响应中,该响应提供有关已验证用户的身份元数据。
service account
每个客户端都有一个内置的服务帐户,该帐户允许其获取访问令牌。
direct grant
Client通过REST调用代表用户获取访问令牌的一种方式。
protocol mappers
对于每个客户端,您可以定制OIDC令牌或SAML断言中存储的声明和断言。您可以通过创建和配置协议映射器为每个客户端执行此操作。
session
用户登录时,将创建一个会话来管理登录会话。会话包含诸如用户何时登录以及在该会话期间哪些应用程序参与了单点登录之类的信息。管理员和用户都可以查看会话信息。
user federation provider
Keycloak可以存储和管理用户。通常,公司已经拥有存储用户和凭证信息的LDAP或Active Directory服务。您可以指向Keycloak来验证来自那些外部存储的凭据并提取身份信息。
identity provider
身份提供者(IDP)是可以对用户进行身份验证的服务。Keycloak是一个IDP。
identity provider federation
可以将Keycloak配置为将身份验证委派给一个或多个IDP。通过Facebook或Google+的社交登录是身份提供商联盟的一个示例。您也可以挂钩Keycloak,以将身份验证委派给任何其他OpenID Connect或SAML 2.0 IDP。
identity provider mappers
执行IDP联合时,您可以将传入的令牌和断言映射到用户和会话属性。这可以帮助您将身份信息从外部IDP传播到请求身份验证的客户端。
required actions
必需的操作是用户在身份验证过程中必须执行的操作。在完成这些操作之前,用户将无法完成身份验证过程。例如,管理员可以安排用户每月重新设置其密码。一个
update password
需要行动将所有这些用户设置。authentication flows
认证流程是用户在与系统的某些方面进行交互时必须执行的工作流程。登录流程可以定义所需的凭据类型。注册流程定义用户必须输入哪些配置文件信息,以及是否必须使用诸如reCAPTCHA之类的内容来过滤出僵尸程序。凭据重置流程定义用户在重置密码之前必须执行的操作。
events
事件是管理员可以查看和连接的审核流。
themes
Keycloak提供的每个屏幕都有一个主题支持。主题定义HTML模板和样式表,您可以根据需要覆盖它们。
2.docker 部署Keycloak
2.1 创建admin 账户
默认情况下,没有创建管理员用户,因此您将无法登录到管理控制台。要创建管理员帐户,您需要使用环境变量来传递初始用户名和密码。这是通过运行以下命令完成的:
docker run -p 8080:8080 -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin quay.io/keycloak/keycloak:11.0.1
您还可以通过运行以下命令在已运行的容器上创建帐户:
docker exec <CONTAINER> opt/jboss/keycloak/bin/add-user-keycloak.sh -u <USERNAME> -p <PASSWORD>
2.2 导入领域
docker run -e KEYCLOAK_USER=<USERNAME> -e KEYCLOAK_PASSWORD=<PASSWORD> \
-e KEYCLOAK_IMPORT=/tmp/example-realm.json -v tmp/example-realm.json:/tmp/example-realm.json jboss/keycloak
2.3 导出领域
docker run -d -p 8180:8080 -e KEYCLOAK_USER=admin -e \
KEYCLOAK_PASSWORD=admin -v $(pwd):/tmp --name kc \
jboss/keycloak
docker exec -it kc opt/jboss/keycloak/bin/standalone.sh \
-Djboss.socket.binding.port-offset=100 -Dkeycloak.migration.action=export \
-Dkeycloak.migration.provider=singleFile \
-Dkeycloak.migration.realmName=my_realm \
-Dkeycloak.migration.usersExportStrategy=REALM_FILE \
-Dkeycloak.migration.file=/tmp/my_realm.json
2.4 数据库
h2
对于嵌入式H2数据库,postgres
对于Postgres数据库,mysql
用于MySql数据库。mariadb
用于MariaDB数据库。oracle
用于Oracle数据库。mssql
用于Microsoft SQL Server数据库
是使用了DB将默认主机名
getent hosts
(postgres
,mysql
,mariadb
,oracle
,mssql
)。如果您使用的是用户定义的网络以及下面指定的默认名称,则此方法有效。是否有一个特定的数据库
_ADDR
环境变量设置(POSTGRES_ADDR
,MYSQL_ADDR
,MARIADB_ADDR
,ORACLE_ADDR
)。
环境变量
DB_ADDR
:指定数据库的主机名(可选)。仅对于postgres,您可以提供以逗号分隔的主机名列表,以进行故障转移备用主机。主机名可以仅是主机,也可以是主机和端口对,例如host1,host2或host1:5421,host2:5436或host1,host2:5000。并且keycloak将DB_PORT(如果指定)附加到不带端口的主机,否则它将默认端口5432再次附加到不带端口的地址。DB_PORT
:指定数据库的端口(可选,默认为数据库供应商默认端口)DB_DATABASE
:指定要使用的数据库的名称(可选,默认为keycloak
)。DB_SCHEMA
:指定用于支持模式的数据库的模式名称(可选,默认在Postgres上为public)。DB_USER
:指定用于认证数据库的用户(可选,默认为``)。DB_USER_FILE
:指定用户通过文件输入(替代DB_USER
)向数据库进行身份验证。DB_PASSWORD
:指定用于验证数据库身份的用户密码(可选,默认为``)。DB_PASSWORD_FILE
:指定用于通过文件输入(替代DB_PASSWORD
)对数据库进行身份验证的用户密码。
MySQL示例
创建用户定义的网络
docker network create keycloak-network
启动一个MySQL实例
docker run --name mysql -d --net keycloak-network -e MYSQL_DATABASE=keycloak -e MYSQL_USER=keycloak -e MYSQL_PASSWORD=password -e MYSQL_ROOT_PASSWORD=root_password mysql
启动Keycloak实例
docker run --name keycloak --net keycloak-network jboss/keycloak
PostgreSQL范例
创建用户定义的网络
docker network create keycloak-network
启动PostgreSQL实例
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 -e DB_USER=keycloak -e DB_PASSWORD=password
MariaDB示例
创建用户定义的网络
docker network create keycloak-network
启动MariaDB实例
docker run -d --name mariadb --net keycloak-network -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=keycloak -e MYSQL_USER=keycloak -e MYSQL_PASSWORD=password mariadb
启动Keycloak实例
docker run --name keycloak --net keycloak-network jboss/keycloak
Oracle示例
下载Oracle JDBC驱动程序
为您的Oracle版本下载所需的JDBC驱动程序。
重要:将文件重命名为
ojdbc.jar
创建用户定义的网络
docker network create keycloak-network
启动一个Oracle实例
docker run -d --name oracle --net keycloak-network -p 1521:1521 carloscastillo/rgt-oracle-xe-11g
启动Keycloak实例
docker run -d --name keycloak --net keycloak-network -p 8080:8080 -v /path/to/jdbc/driver:/opt/jboss/keycloak/modules/system/layers/base/com/oracle/jdbc/main/driver jboss/keycloak
docker cp ojdbc.jar jboss/keycloak:/opt/jboss/keycloak/modules/system/layers/base/com/oracle/jdbc/main/driver/ojdbc.jar
DB_ADDR
:oracleDB_PORT
:1521DB_DATABASE
:XEDB_USER
:SYSTEMDB_PASSWORD
:oracle
Microsoft SQL Server示例
创建用户定义网络
docker network create keycloak-network
启动Microsoft SQL Server实例
docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=Password!23' -d --name mssql --net keycloak-network mcr.microsoft.com/mssql/server
docker run -d --name mssql-scripts --net keycloak-network mcr.microsoft.com/mssql-tools /bin/bash -c 'until /opt/mssql-tools/bin/sqlcmd -S mssql -U sa -P "Password!23" -Q "create database Keycloak"; do sleep 5; done'
启动Keycloak实例
docker run --name keycloak --net keycloak-network -p 8080:8080 -e DB_VENDOR=mssql -e DB_USER=sa -e DB_PASSWORD=Password!23 -e DB_ADDR=mssql -e DB_DATABASE=Keycloak -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin jboss/keycloak
指定JDBC参数
PostgreSQL的
的MySQL
玛丽亚数据库
甲骨文
Microsoft SQL服务器
例
docker run --name keycloak -e DB_VENDOR=postgres -e JDBC_PARAMS='connectTimeout=30' jboss/keycloak
2.5添加自定义主题
KEYCLOAK_WELCOME_THEME
:指定用于欢迎页面的主题(必须为非空,并且必须与现有主题名称匹配)
KEYCLOAK_DEFAULT_THEME
:指定要用作默认全局主题的主题(必须与现有主题名称匹配,如果为空则将使用keycloak)
3.进入控制台
4. 创建一个领域
5. 创建一个用户
用户名:myuser
名:您的名字
姓氏:您的姓氏
单击Credentials(页面顶部)
Set Password用密码填写表格
Temporary: 单击ON,防止在首次登录时更新密码
6.登录到帐户控制台
7. 保护您的第一个应用
客户编号:myclient
客户端协议:openid-connect
根网址:https://www.keycloak.org/app/
4.请点击 Save
8.更多
切换到生产就绪数据库,例如PostgreSQL
使用您自己的证书配置SSL
将管理员密码切换为更安全的密码













