Keycloak

部署

使用 docker compose 快速部署 keycloak。

两个关键点:

  • 数据库。目前使用 postgresql 部署最为流畅,mysql 没折腾出来。
  • TLS。keycloak 默认启用 TLS 保护 http 接口,如果是开发体验可关闭 TLS。
    • 启动后,需通过数据库工具进入数据库,手动修改数据库中 realm 配置,关闭 TLS。
version: '3.1'

services:

  postgresql:
    image: bitnamilegacy/postgresql:16.2.0
    environment:
      - ALLOW_EMPTY_PASSWORD=yes
      - POSTGRESQL_USERNAME=bn_keycloak
      - POSTGRESQL_DATABASE=bitnami_keycloak
    ports:
      - '5432:5432'
    networks:
      - keycloak

  keycloak:
    image: bitnamilegacy/keycloak:26.2.5
    depends_on:
      - postgresql
    environment:
      - KEYCLOAK_CREATE_ADMIN_USER=true
      - KEYCLOAK_ADMIN_USER=user
      - KEYCLOAK_ADMIN_PASSWORD=bitnami
      - KEYCLOAK_JDBC_DRIVER=postgresql
      - KEYCLOAK_DATABASE_VENDOR=postgresql
      - KEYCLOAK_DATABASE_HOST=postgresql
      - KEYCLOAK_DATABASE_PORT=5432
      - KEYCLOAK_DATABASE_NAME=bitnami_keycloak
      - KEYCLOAK_DATABASE_USER=bn_keycloak
      - KEYCLOAK_ENABLE_HTTPS=false # 关闭https
      - KC_HTTP_PORT=8089
    ports:
      - '10020:8089'
    networks:
      - keycloak

networks:
  keycloak:
    driver: bridge

进入数据库,关闭 TLS

keycloak_realm_disable_ssl

Keycloak 登陆信息如下:

配置 Keycloak

配置 client

keycloak_create_client_01

keycloak_create_client_02

keycloak_create_client_03

keycloak_create_client_04

创建用户完毕后,需要记录下 client-secret,client-id 就是创建的 client 名称:my-client

keycloak_client_credentials

配置角色

keycloak_add_user_01.png

keycloak_add_user_02.jpg

keycloak 支持两种角色:client-roles 和 realm-roles。这里简单介绍 client-roles 创建

keycload_add_client_role_01.jpg

keycload_add_client_role_02.jpg

keycload_add_client_role_03.jpg

后续就可以给用户添加角色

keycload_assign_user_roles_01

获取角色配置

在多个支持 OIDC 的开源或闭源,只能支持登陆认证,也就是 SSO,不支持鉴权环节。问题就在于需要获取到拥有的角色,或者授权策略。

这里简单介绍通过 keycloak 自定义的 scope 获取到用户拥有的角色。通过这种方式介绍自定义 scope 的使用

[!CAUTION]

keycloak 本身是支持授权管理的,如 RBAC、ABAC。这里介绍的方式并不是 keycloak 本身的授权管理功能

新建一个 client scope,命名为 my-roles

keycloak_custom_scope_01

keycloak_custom_scope_02

添加 mapper 获取到 keycloak 中用户拥有的角色:

keycloak_custom_scope_03

keycloak_custom_scope_04

keycloak_custom_scope_05

在预定义的 realm rolesclient roles mapper 是把角色放到 access-token 里面,可以调整把角色信息放到 id-token 和 user-info 里面:

keycloak_custom_scope_06

把自定义的 scope my-roles 添加定义的 client my-client 即可,后续即可在 spring security 接入时声明需要的 scope 中加入 my-roles,然后就可以在 id-token 和 user-info 中获取到用户拥有的 client roles 和 realm roles

keycloak_custom_scope_07

Spring Security 接入

参考链接